问题标签 [gcc-4.2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 枚举导致二进制更改与 Gcc 4.2.4 中的优化
我正在使用 GCC 版本 4.2.4。下面解释的问题无法在 Gcc 4.6.x 上重现,这是我测试的仅有的两个版本。
我有一个定义枚举的头文件,标题:abc.h
这个头文件包含在几个源文件中,每个源文件在编译时创建一个对象 (.o)。并且很少有源文件不引用 abc.h 中的任何枚举。
我看到的问题是,如果我在 abc.h 中添加一个新常量 (VALUE_3),那么不使用任何枚举的对象的二进制 md5sum 也会发生变化。这仅在我应用优化时发生,而不是在编译时发生。
我怀疑它与启用优化的标志 -ftree-vrp 和 -ftree-dominator-opts 有关。将这些标志与 -fno 一起使用仍会导致某些对象发生更改,但会阻止其他少数对象发生更改(使用这些标志进行更改)。
另一个有趣的观察是 md5sum 对于偶数或奇数的枚举是相同的。
任何人都可以帮助我了解后端发生了什么,并且当该特定对象没有实际代码更改时,是否有任何方法可以避免二进制更改以维护 md5sum。
提前致谢。
编辑:
对于一个对象,以下是差异。对于其他对象,也几乎没有其他更改(在 mov 等指令中)。如您所见,仅交换了某些指令中的操作数寄存器。我想了解原因以及如何通过优化来避免它。