GCC 下局部优化关闭,兼解决libcurl之curl_easy_perform code 27

在Gcc下经常会出现莫明其妙的问题。就此问题请教了一友人,得到的结论是,GCC在O3优化模式时有时会生成错误的代码,特别是在no-omit-frame-pointer参数一起用时会导致栈错误之类问题。不幸的是,当使用vs
studio的cross
platform开发linux程序时,默认的优化参数就是这样的组合。在通常的小程序时,可能感觉不到啥问题。
我这次使用libcurl通过ssl 双向证书方式与服务器进行通讯。在debug模式下,一切正常,看起来很美好。
当转为release模式(无-g)时,优化参数改为O3, omit-frame-pointer. 在这个模式下会导致
libcurl之curl_easy_perform code 27,错误码27意思是out of memory,
但是实际上,libcurl把几个错误合并为一个,比如它在初始化ssl出错时,也报这个错,这时,get confused.
查了半天代码,一无所获。
后来实在没办法测试了普通的libcurl例子并没有发现啥问题。
此时,只好在工程参数上着手,根据以前的经验,应该是优化参数原因,对比debug模式,改为O0及no-omit-frame-pointer,
一切正常。 但是,作为一个senior programmer(老司机)啦,不能这样容忍自己的程序不优化执行。
经过跟友人讨论得知,可以进行局部去优化,方法如下:
#pragma GCC push_options
#pragma GCC optimize("O0")
#pragma GCC optimize("no-omit-frame-pointer")
#pragma GCC push_options
#pragma GCC optimize("O0")
#pragma GCC optimize("no-omit-frame-pointer")
// here, your own code...
#pragma GCC pop_options
这样就完全关闭了此段代码地优化,并关闭 omit-frame-pointer
优化。打开此优化也会导致局部变量问题。比如我的程序中,那个curl指针,如果放到函数中就有问题,放到类的成员变量中就没问题,初步推测也是因为frame
pointer指针优化导致栈指针错误。
本着不怀疑编译器的想法,询问友人有没有可以改代码解决,答案是:改编译器代码(本质上是编译器的优化错误),好吧,不是编译器专家,只能忽略。
附图为友人的大法,解决gcc/win平台类似问题
http://s10/mw690/001wVhwmzy79G7iVDL379&690下局部优化关闭,兼解决libcurl之curl_easy_perform code 27" TITLE="GCC 下局部优化关闭,兼解决libcurl之curl_easy_perform code 27" />