cp-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub rniya/cp-library

:warning: Stack Extend
(src/util/stack_extend.hpp)

概要

ICPC 国内予選など手元実行が必要になる際に,再帰に代表される重い処理はスタックオーバーフローを引き起こしやすい. それを回避するためにスタックを付け替えるマクロ. 具体的には以下のようにして用いる.

#include "stack_extend.hpp"

int main(){
    BEGIN_STACK_EXTEND(256 * 1024 *1024);   // 256 MB

    /**
     * メインの処理
     */

    END_STACK_EXTEND;
}

Code

#pragma once
#include <cstdlib>

#define BEGIN_STACK_EXTEND(size)                                                                                 \
    void* stack_extend_memory_ = malloc(size);                                                                   \
    void* stack_extend_origin_memory_;                                                                           \
    char* stack_extend_dummy_memory_ = (char*)alloca((1 + (int)(((long long)stack_extend_memory_) & 127)) * 16); \
    *stack_extend_dummy_memory_ = 0;                                                                             \
    asm volatile("mov %%rsp, %%rbx\nmov %%rax, %%rsp"                                                            \
                 : "=b"(stack_extend_origin_memory_)                                                             \
                 : "a"((char*)stack_extend_memory_ + (size)-1024));
#define END_STACK_EXTEND                                                 \
    asm volatile("mov %%rax, %%rsp" ::"a"(stack_extend_origin_memory_)); \
    free(stack_extend_memory_);
#line 2 "src/util/stack_extend.hpp"
#include <cstdlib>

#define BEGIN_STACK_EXTEND(size)                                                                                 \
    void* stack_extend_memory_ = malloc(size);                                                                   \
    void* stack_extend_origin_memory_;                                                                           \
    char* stack_extend_dummy_memory_ = (char*)alloca((1 + (int)(((long long)stack_extend_memory_) & 127)) * 16); \
    *stack_extend_dummy_memory_ = 0;                                                                             \
    asm volatile("mov %%rsp, %%rbx\nmov %%rax, %%rsp"                                                            \
                 : "=b"(stack_extend_origin_memory_)                                                             \
                 : "a"((char*)stack_extend_memory_ + (size)-1024));
#define END_STACK_EXTEND                                                 \
    asm volatile("mov %%rax, %%rsp" ::"a"(stack_extend_origin_memory_)); \
    free(stack_extend_memory_);
Back to top page