在 C++ 中处理指针别名的确切规则是什么?

bob*_*eff 5 c++ pointers strict-aliasing language-lawyer

在 C 中有一个restrict关键字告诉编译器在函数的指针参数之间没有别名,允许它以这种方式执行一些否则将不允许的优化。例如:

void add(int* restrict ptrA,
         int* restrict ptrB,
         int* restrict val)
{
    *ptrA += *val;
    *ptrB += *val;
}
Run Code Online (Sandbox Code Playgroud)

现在函数体中的指令可以并行执行,因为val和 某些ptr参数之间没有别名。在 C++ 中没有restrict关键字。

  1. 在标准定义的 C++ 中处理指针别名的确切规则是什么?
  2. 哪些流行的编译器扩展提供类似于restrictC 中的语义?例如MSVCg++clang++Intel C++ compiler
  3. restrict在未来的 C++ 标准中是否有任何计划要标准化的关键字?