gcc根据优化创建崩溃代码

时间:2015-03-17 14:56:17

标签: c++ c++11 gcc segmentation-fault

我有一个相当复杂的多线程代码,我使用gcc 4.8.1编译。用

编译时
g++ -c file.cc -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O2 -fPIC -funroll-loops -fforce-addr -rdynamic

代码产生崩溃与segfault(我无法调试,但结构的地址突然不同于构造时的地址,特别是,不再按照代码的要求对齐到32字节但是只有8字节)。

使用-O1进行编译时,代码运行正常。然后,我添加了所有优化标记,这些标记在-O1-O2之间产生了差异。 (为此,我通过

创建了两个文件O1-optsO2-opts
g++ -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O1 -fPIC -funroll-loops -fforce-addr -rdynamic
-Q --help=optimizers > O1-opts

g++ -march=native -mfpmath=sse -mpreferred-stack-boundary=4
--param inline-unit-growth=50 -ggdb3 -Wall -Wextra -Winit-self
-O2 -fPIC -funroll-loops -fforce-addr -rdynamic
-Q --help=optimizers > O2-opts

diff O1-opts O2-opts提供选项差异时)。将 all 选项差异添加到-O1时,生成的代码仍然不会崩溃。这让我很困惑。所以我的问题是:这不应该给完全-O2相同的结果吗? (还有:我问题的可能原因是什么?)

1 个答案:

答案 0 :(得分:3)

关键是-O2选项不仅设置了不同的标志,而且与-O1形成对比,还可以进行额外的优化。

GCC Wiki的FAQ部分有适当的this条目。