我想知道如果我用以下代码编译,我是否得到完全相同的二进制结果:
或者是否存在可能导致不同二进制文件的其他约束:
谢谢!
答案 0 :(得分:1)
无法保证仅通过修复代码,库和编译器就可以获得相同的输出。正如您所确定的那样,运行编译器的环境可能会产生影响:
即使您可以找到并控制所有这些功能,编译也可能不具有确定性。以下是GCC 3.3 documentation的具体示例(请注意最近版本中的措辞已更改):
-fno猜测分支概率
不要使用随机模型猜测分支概率。 有时gcc会选择使用随机模型来猜测分支概率,当分析反馈(-fprofile-arcs)或__builtin_expect都没有。这意味着在同一程序上不同的编译器运行可能会产生不同的目标代码。
在硬实时系统中,人们不希望编译器的不同运行产生具有不同行为的代码;最大限度地减少非决定论是至关重要的。该开关允许用户减少非确定性,可能以较差的优化为代价。