关于下面的示例,在f1
中,不会发生别名,因为无法访问p
(void*
),并且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;
}
答案 0 :(得分:7)
复制指针或将其传递到其他位置或转换它的次数无关紧要,决定因素始终是该位置实际存储的内容。
在您的情况下,唯一重要的是static_cast
的参数是否实际上是float
的地址,而不是。
答案 1 :(得分:0)
适合在具有已发布的ABI的平台上进行低级编程的编译器,将提供一种强制以与该ABI一致的方式执行函数调用的方法,这反过来将迫使“严格的违反别名的行为”越过要以“文件化的环境特征”处理的函数调用边界。这种支持是“流行的扩展”,该标准的作者认为其不在其管辖范围之内。设计和配置为适合低级编程的编译器将支持此类构造,而无需考虑标准是否要求它,并且不应将未设计和配置为适合此类目的的那些编译器用于它们。