ホーム > libalgo

スタック拡張マクロ

概要

自分で確保した領域にスタックを付け替える.一度実行して正しく動くか確認すること.

実装

#define BEGIN_STACK(size)                                                  \
    void *dummy = malloc(size);                                            \
    void *org_stack;                                                       \
    char *my = (char *)alloca((1 + (int)(((long long)dummy) & 127)) * 16); \
    *my = 0;                                                               \
    asm volatile(                                                          \
        "mov %%rsp, %%rbx\n"                                               \
        "mov %%rax, %%rsp"                                                 \
        : "=b"(org_stack)                                                  \
        : "a"((char *)dummy + (size)-1024));

#define END_STACK                                      \
    asm volatile("mov %%rax, %%rsp" ::"a"(org_stack)); \
    free(dummy);

int test(int i) {
    char weight[1024];
    memset(weight, -1, sizeof weight);
    std::cout << i << " KB" << std::endl;
    if (weight[0])
        return test(i + 1);
    else
        return 0;
}

int main() {
    BEGIN_STACK(256 * 1024 * 1024);  // 256 MB
    test(0);
    END_STACK;
}

参考文献

TopCoderのスタックサイズの増やし方・改 | システム工房コルン