函数在递归调用时会占用栈的空间,因此,当递归达到一定的深度时,就会出现栈溢出的情况——by https://blog.csdn.net/xifengcode/article/details/83352536
于是为了调大栈空间,我们就要用一些玄学代码解决,网上的版本都是这样:
int size = 256 << 20; // 指定栈大小为256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));
用内嵌指令集实现。我一直用的32位编译器,没什么问题。但有一天我用64位编译器编译时g++报错:Error: operand type mismatch for `mov'
但网上这类资料不多,查不到。其实是应为 esp 是32位指针寄存器,在64位下应为 rsp 。在根据__x86_64__
和_M_X64
判断是否是64位环境,相应的32位也可以判断了。就有了一下函数,以MB位单位设置栈空间。
void set_stack(uint64_t MBs=256) {
int64_t size = MBs << 20; // 指定递归栈大小为 MBs MB
char* p = (char*)malloc(size) + size;
#if defined(__x86_64__) || defined(_M_X64)
__asm__("mov %0, %%rsp\n"
:
: "r"(p));
#elif defined(__i386__) || defined(_M_IX86)
__asm__("mov %0, %%esp\n"
:
: "r"(p));
#else
#error Unsupported architecture
#endif
}
就OK了。