This documentation is automatically generated by online-judge-tools/verification-helper
#include "src/util/stack_extend.hpp"ICPC 国内予選など手元実行が必要になる際に,再帰に代表される重い処理はスタックオーバーフローを引き起こしやすい. それを回避するためにスタックを付け替えるマクロ. 具体的には以下のようにして用いる.
#include "stack_extend.hpp"
int main(){
BEGIN_STACK_EXTEND(256 * 1024 *1024); // 256 MB
/**
* メインの処理
*/
END_STACK_EXTEND;
}
#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_);