wan*_*wan 0 c++ strict-aliasing language-lawyer
关于下面的示例,在中f1,不会发生别名,因为p(void*)无法访问,并且p1是访问内存的唯一指针。但是,p1(float*)和p2(int*)之间的指针别名在outside之外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;
}
Run Code Online (Sandbox Code Playgroud)
复制指针或将指针传递到其他位置的次数或转换指针的次数无关紧要,决定因素始终是该位置实际存储的内容。
在您的情况下,唯一重要的是static_cast的参数是否实际上是a的地址float,而实际上不是。