【Tricks】手动扩栈

众所周知,HDU等搭建在windows下的OJ系统栈小得一逼,所以我们得手动扩栈……..
其实平时比赛,如果递归爆栈了,也是可以用这个特殊技能水一水的:

G++: 
int size = 256 << 20; // 256MB  
char *p = (char*)malloc(size) + size;  
__asm__("movl %0, %%esp\n" :: "r"(p)); 

C++: 
#pragma comment(linker, "/STACK:102400000,102400000")    

当然,如果会写手工栈,那也是极好的,然而我不会QAQ

———— 2016.8.28 更新 ————-
在BZOJ这种linux平台下,好像上面的扩栈方法不管用
于是我们可以添加如下代码:

const int main_stack=16;
char my_stack[128<<20];//À©Îª128MB
int main()
{
	__asm__("movl %%esp, (%%eax);\n"::"a"(my_stack):"memory");
	__asm__("movl %%eax, %%esp;\n"::"a"(my_stack+sizeof(my_stack)-main_stack):"%esp");
	my_main();
	__asm__("movl (%%eax), %%esp;\n"::"a"(my_stack):"%esp");
	return 0;
}

然后把原来的 int main() 改成 int my_main() 即可

—————————— UPD 2017.7.3 ——————————
在g++的编译命令里加入-Wl,--stack=536870912也可以开栈

Leave a Reply

Your email address will not be published. Required fields are marked *