转载自https://blog.csdn.net/f_zyj/article/details/51467501
今天忽然遇见了一行很牛逼的代码:#pragma comment(linker, “/STACK:1024000000,1024000000”)
据说是手动加栈的,作为小白的我自然是只好各种查资料。然后牵扯到了很多基础概念,C、C++、GCC、G++、把我搞得晕头转向,都分不清谁是谁了。
经查阅资料:
G++和C++都是C++语言的编译器,二者基本相同。
而GCC和C都是C语言编译器,而这差别实际也不大。
尽管C++规范中兼容绝大部分C的用法和几乎全部函数,但毕竟还是有更改的地方。
解决爆栈,手动加栈
这个关系一下子真的有些分不清你你我我,但是可以肯定的是当我们用C++时,可以用上边的这句代码进行手动加栈。(#pragma comment(linker, “/STACK:1024000000,1024000000”))
而C时,我们则要说另外一句代码:#pragma GCC optimize (“O2”)
我想,对于这个02你应该会有一丝的警觉,02表示一种状态,那么是不是还有其他的状态呢?
对,这个真有。GCC的#pragma优化主要分为四种 -O0 -O1 -O2 -O3
-O0 表示无优化状态
-O1 表示对代码进行了优化
-O2 表示减小目标文件大小
-O3 表示减小代码段及栈空间的大小
对部分代码可以去除优化:
#pragma GCC push_options
#pragma GCC optimize (“O0”)
或者也可以增加优化
#pragma GCC pop_options
另外要说的是,想要对代码进行进一步的优化,可以使用输入加速外挂,对C、C++均可行。
今晚刷不进去题就把这个测试了一下,发现上面那一句对于递归层数没什么影响,于是搜了一下说是C++编译器用那一句而G++则是要用下面这句,本地CB用的都是G++编译的 ,经实验可以成功加栈
- int size = 1024 << 20; // 1024MB
- char *p = (char*)malloc(size) + size;
- __asm__("movl %0, %%esp\n" :: "r"(p));
测试发现,默认栈大概有64M,在我递归体仅输入递归次数时可以递归6w+次,经过加栈我本地最多可以递归到6000w+次,但此时我的栈已经开到了1.8G,而且在递归体内定义了几个变量,进行了几次赋值操作后,递归层数锐减一半以上。所以比赛时还是要慎用这个功能,毕竟内存也有限制加的太多了栈不溢出内存该超了<-使用了汇编语言 不同的不一样,上面的对应c++服务器,下面的对应G++服务器