【发布时间】:2015-03-17 14:56:16
【问题描述】:
我有一个相当复杂的多线程代码,我使用 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-opts和O2-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 时,生成的代码仍然不会崩溃。这让我很困惑。所以我的问题是:这不应该给 exactly 与-O2 相同的结果吗? (还有:我的问题的可能原因是什么?)
【问题讨论】:
-
崩溃取决于优化级别听起来像是未定义的行为,但我们没有足够的信息。
-
@ShafikYaghmour 我知道,但这不是主要问题。
-
@Walter 这可能是他在评论中回答你的次要问题而不是答案的原因。
-
我已经尝试过类似的实验但没有成功,我最好的猜测是记录的标志并没有完全覆盖差异。
-
根据定义,未定义的行为不能保证从一个编译到另一个编译时给出完全相同的结果,无论使用何种标志。甚至从程序的一次运行到下一次即使没有重新编译。
标签: c++ c++11 gcc segmentation-fault