c++ - gcc 根据优化创建崩溃代码

标签 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

代码因段错误而崩溃(我无法调试,但结构的地址突然与构造时不同,特别是不再按照代码要求与 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提供选项差异时)。将所有选项差异添加到-O1时,生成的代码仍然不会崩溃。这让我很困惑。所以我的问题是:这不应该给出与 -O2 完全相同的结果吗? (还有:我的问题的可能原因是什么?)

最佳答案

重点是,-O2 选项不仅可以设置不同的标志,而且与 -O1 相比还可以实现额外的优化。

GCC Wiki 的常见问题解答部分有一个适当的条目 this .

关于c++ - gcc 根据优化创建崩溃代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102414/

相关文章:

c++ - 如何解决问题 "No source available for "msvcrt!fgets() ""

c++ - 在c++中比较用户定义函数内的用户指定数量的数字

c++ - 在 C++ 中,当你制作多个类时,你是否应该将它们分别放在它们自己的 .cpp/.h 对中?

c++ - 确定选择了哪个重载

c++ - 使用堆栈添加带有组件的 2 个 vector 组件

c - 合并多个 .so 共享库

C++:如何在不执行函数的情况下将函数+参数作为参数传递?

c++ - lambda 的捕获变量被重置

c++ - 重载内置(固有?)功能

c - 为什么ld的输出二进制无法执行?