严格混叠规则是否适用于函数调用?

时间:2019-04-15 13:27:22

标签: c++ language-lawyer strict-aliasing

关于下面的示例,在f1中,不会发生别名,因为无法访问pvoid*),并且p1是唯一访问内存的指针。 但是,在p1之外的float*p2)和int*f1)之间有一个别名别名。
我的问题是,此别名是否非法,也就是说,严格混叠规则是否适用于函数调用?

如果此示例有效,那么如果内联f1怎么办?

void f1(void *p)
{
  auto* p1 = static_cast<float*>(p);
  *p1 = 1.f;
}

int f2()
{
  int x = 1;
  auto* p2 = &x;
  f1(&x);
  *p2 = 1;
  return *p2;
}

2 个答案:

答案 0 :(得分:7)

复制指针或将其传递到其他位置或转换它的次数无关紧要,决定因素始终是该位置实际存储的内容。

在您的情况下,唯一重要的是static_cast的参数是否实际上是float的地址,而不是。

答案 1 :(得分:0)

适合在具有已发布的ABI的平台上进行低级编程的编译器,将提供一种强制以与该ABI一致的方式执行函数调用的方法,这反过来将迫使“严格的违反别名的行为”越过要以“文件化的环境特征”处理的函数调用边界。这种支持是“流行的扩展”,该标准的作者认为其不在其管辖范围之内。设计和配置为适合低级编程的编译器将支持此类构造,而无需考虑标准是否要求它,并且不应将未设计和配置为适合此类目的的那些编译器用于它们。