在 C++ 中,"access" 在严格的别名规则中意味着什么?
In C++, What does "access" mean in the strict aliasing rule?
3.10/10 说:
If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined:
但是,术语 "access" 未在任何地方定义。在这种情况下,它是指 read,还是 read or modify?
在C标准中明确定义为读取或修改。然而在C++11中,它似乎在不同的时间使用不同的含义,例如:
1.9/8:
Access to volatile objects are evaluated strictly according to the rules of the abstract machine.
显然这意味着要读取或修改,但是在许多其他地方,例如 1.10/24:
- access or modify a volatile object, or
它被用作好像它只意味着读。
我不自称是语言律师。然而...
我会将短语 "access the stored value of an object" 解释为“读取 对象的存储值”。
鉴于上一段讨论修改对象,这种解释更有意义。
9 If an expression can be used to modify the object to which it refers, the expression is called modifiable. A program that attempts to modify an object through a nonmodifiable lvalue or rvalue expression is ill-formed.
必须是读和写的意思,否则这条规则意义不大。考虑来自 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html 的示例:
float *P;
void zero_array() {
int i;
for (i = 0; i < 10000; ++i)
P[i] = 0.0f;
}
仅当编译器可以假定 P[i]
的 none 别名 P
时,才能将上面的示例代码优化为 memset
。但是考虑一个世界,其中只有 read 来自不允许的泛左值是 UB,那么即使 P[i]
别名 P
某些 i
- 例如,如果有人做了 P = (float *) &P;
,因为 P
的所有 读取 都是完全合法的 - 他们都使用左值表达式 P
。
编辑:CWG issue 1531 说的很对。该问题已于 2013 年 4 月移至 DR(缺陷报告)状态,但无论出于何种原因,该解决方案均未应用于工作文件。
3.10/10 说:
If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined:
但是,术语 "access" 未在任何地方定义。在这种情况下,它是指 read,还是 read or modify?
在C标准中明确定义为读取或修改。然而在C++11中,它似乎在不同的时间使用不同的含义,例如:
1.9/8:
Access to volatile objects are evaluated strictly according to the rules of the abstract machine.
显然这意味着要读取或修改,但是在许多其他地方,例如 1.10/24:
- access or modify a volatile object, or
它被用作好像它只意味着读。
我不自称是语言律师。然而...
我会将短语 "access the stored value of an object" 解释为“读取 对象的存储值”。
鉴于上一段讨论修改对象,这种解释更有意义。
9 If an expression can be used to modify the object to which it refers, the expression is called modifiable. A program that attempts to modify an object through a nonmodifiable lvalue or rvalue expression is ill-formed.
必须是读和写的意思,否则这条规则意义不大。考虑来自 http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html 的示例:
float *P;
void zero_array() {
int i;
for (i = 0; i < 10000; ++i)
P[i] = 0.0f;
}
仅当编译器可以假定 P[i]
的 none 别名 P
时,才能将上面的示例代码优化为 memset
。但是考虑一个世界,其中只有 read 来自不允许的泛左值是 UB,那么即使 P[i]
别名 P
某些 i
- 例如,如果有人做了 P = (float *) &P;
,因为 P
的所有 读取 都是完全合法的 - 他们都使用左值表达式 P
。
编辑:CWG issue 1531 说的很对。该问题已于 2013 年 4 月移至 DR(缺陷报告)状态,但无论出于何种原因,该解决方案均未应用于工作文件。