在C++中,"access"在严格混叠规则中意味着什么?

In C++, What does "access" mean in the strict aliasing rule?

本文关键字:规则 意味着 什么 C++ access      更新时间:2023-10-16

3.10/10 说:

如果程序尝试通过以下类型之一以外的 glvalue 访问对象的存储值,则行为是未定义的:

但是,术语"访问"在任何地方都没有定义。在这种情况下,它是否意味着读取或读取或修改


在C标准中,它被明确定义为读取或修改。 然而,在 C++11 中,它似乎在不同的时间以不同的含义使用,例如:

1.9/8:

对易失性对象的访问严格根据抽象机器的规则进行评估。

显然,这是要阅读或修改的,但是在许多其他地方,例如 1.10/24:

  • 访问或修改易失性对象,或

它被使用时好像它只意味着阅读

它必须意味着读取和写入,否则规则将没有多大意义。考虑 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]别名都没有P时,才能将上面的示例代码优化为memset。但是考虑一个只从不允许的glvalue读取是UB的世界,那么即使P[i]别名P某些i,上面的代码也不会调用UB——例如,如果有人P = (float *) &P;,因为所有P的读取都是完全合法的——它们都使用lvalue表达式P


编辑:CWG 第 1531 期直接切中要害。该问题于 2013 年 4 月移至 DR(缺陷报告)状态,但无论出于何种原因,该决议均不适用于工作文件。

我不声称自己是语言律师。然而。。。

我将短语"访问对象的存储值

"解释为"读取对象的存储值"。

考虑到上一段,这种解释更有意义,该段谈到了修改对象。

9 如果表达式可用于修改它所引用的对象,则该表达式称为可修改表达式。尝试通过不可修改的左值或右值表达式修改对象的程序格式不正确。