手动加栈

9 篇文章 0 订阅
4 篇文章 0 订阅

转载自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的用法和几乎全部函数,但毕竟还是有更改的地方。

ACM模版

解决爆栈,手动加栈

这个关系一下子真的有些分不清你你我我,但是可以肯定的是当我们用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++编译的 ,经实验可以成功加栈

[cpp]  view plain  copy
  1.     int size = 1024 << 20; // 1024MB  
  2. char *p = (char*)malloc(size) + size;  
  3. __asm__("movl %0, %%esp\n" :: "r"(p));  

测试发现,默认栈大概有64M,在我递归体仅输入递归次数时可以递归6w+次,经过加栈我本地最多可以递归到6000w+次,但此时我的栈已经开到了1.8G,而且在递归体内定义了几个变量,进行了几次赋值操作后,递归层数锐减一半以上。所以比赛时还是要慎用这个功能,毕竟内存也有限制加的太多了栈不溢出内存该超了<-使用了汇编语言 不同的不一样,上面的对应c++服务器,下面的对应G++服务器


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值