|
|
1
0
C和C++中有许多潜在的优化,它们通常是安全的,但并不完全合理。如果有人认为
C版本:
C++版本:
除非p2中的地址比p1高四个字节,否则优化将是正确的。在C或C++中使用的“传统”抽象模型下,如果
如果执行第三个赋值,则在地址0x1000处会有一个对象,其第二个字段(在地址0x1004处)将保持可读值1。如果跳过赋值,则地址0x1004处会有一个对象,其第一个字段将包含值2。在这两种情况下都会定义行为,不知道应用哪种情况的编译器必须通过使0x1004处的值取决于
碰巧的是,clang的作者似乎没有提供这种情况,因此省略了条件检查。虽然我认为标准应该使用一个允许这种优化的抽象模型,同时在不涉及奇怪的混叠角情况的情况下支持公共结构创建模式,但我看不出有任何方法可以在不允许编译器任意破坏大量现有代码的情况下解释标准,从而允许这种优化。 我不认为有任何通用的方法可以知道,当gcc或clang决定不实施特定的优化时,代表着对优化不正确的潜在角落情况的认识,并且无法证明这些情况都不适用,当它只是代表一种疏忽,可以“纠正”,以不健全的优化取代正确的行为。 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
MysteryMoose · GCC下故意忽略初始化器警告中的过量元素 1 年前 |
|
|
Ken P · 如何利用[*]printf格式类型规范警告? 1 年前 |
|
fghoussen · 在C结构体中,为什么打包、对齐似乎会进行填充? 1 年前 |
|
|
adversarr · 全局变量何时导出到可执行文件? 1 年前 |