GCC O2编译的bug

最近对以前写的tcp网络库做吞吐量测试,gcc O1编译,运行效果很好,可以达到900MiB/s。

但是问题来了,当我用gcc O2选项编译网络库,程序一启动就core掉。

查看coredump文件,原因大概如下:

挂在g_pool.DoSomething();

但是在DoSomething()里, this != &g_pool;

非常诡异。


我对自己的程序还是很有信心,不会有stack或者heap溢出错乱:

不使用静态数组,只用容器;

只new但不delete,资源交给 UniquePtr   SharedPtr管理。


google之,有老外说O2的sibling-call优化有bug,禁用掉就可以。我试了一下,还是core掉。

于是开始用最笨的办法,比较O1和O2的区别,一个一个的加编译选项,看是哪个导致了core


最终发现了-fgcse,只要在-O2后面加上-fno-gcse,程序就好了


这个选项的具体含义不清楚,也没兴趣了解,反感linux。


其实是很想测windows下的吞吐量,我比较迷信IOCP。

无奈没有windows服务器,个人PC性能太差。

结果就发现了gcc编译优化的这个问题。

你可能感兴趣的:(LINUXC++)