C++ 手动开栈方法

来源:互联网 发布:lol显示网络连接异常 编辑:程序博客网 时间:2024/05/22 16:41

在信息学竞赛中,评测时的栈空间通常和内存限制相同。然而在本机调试时,特别是在 Windows 环境下,常常会遇到因系统限制而导致栈空间不够用的情况(如需要较多层数的递归)。这时,我们就需要手动开大栈空间。开大栈空间可以通过编译器和代码两种方式解决。本文就介绍一下如何通过代码手工开大栈空间。


首先,在程序开头定义以下宏:

#define new_stack(n_byte) \    void *new_stack = malloc(n_byte); \    asm("pushl %%ebp\n\t" \        "movl %%esp, %%ebp\n\t" \        "movl %%eax, %%esp\n\t" \        ::"a" ((int)new_stack + n_byte))#define free_stack() \    asm("leave"::); \    free(new_stack)

因为这段代码有用到 malloc 和 free 函数,所以需要包含头文件 malloc.h。
然后,在 main 函数里按如下方式使用:

int main(){    new_stack(16777216); //16777216 为栈的大小,字节为单位    // ...要用到栈的操作    free_stack(); //释放所开的栈空间    return 0;}

原理的话,就是通过 malloc 申请一块内存,然后将系统栈指针指向申请的内存顶端,从而做到增大栈空间的目的。
在这里要说一下,网上的很多别的教程在这里往往没有释放这一个步骤,这是很不好的一个习惯。当然,释放完之后就不能再进行需要用到很多栈空间的操作了。