cpp类型双关
类型双关
C标准中的未定义行为,对于一个变量分配的内存,我们绕过c++的类型系统,原始的看待这块内存,将它按照另外的类型解读。
代码示例
struct Vector
{
int x, y;
int* GetPosition()
{
return &x; //将Vector双关为一维数组
}
}
Vector v = {100, 200};
//传统写法
int x = v.x, y = v.y;
//双关后
int* Position = v.GetPosition();
int x = Position[0], y = Position[1];
//或者
int* Position = (int*)&v;
int x = Position[0], y = Position[1];
问题
类型双关是一种指针重叠(pointer aliasing),两个指针指向内存同一位置但将其解释为不同的数据类型。编译器会将两个指针视为不相干的指针。对于任何可以通过两个指针访问的数据,类型双关会产生依赖问题。
大多数时候,类型双关不会导致问题,它是C标准中的未定义行为,但通常会按照我们的预期运行。然而,当你想要通过优化选项提高程序性能时,就会出现问题。例如,当你打开XCode中的"Enforce Strict Aliasing"选项(或者GCC中的-fstrict_aliasing),就会出现不可预测的结果。在强重叠/严格别名(strict aliasing)下,编译器可能会按照错误顺序处理事务,甚至将指令完全漏过。
具体来说,错误只会出现在当你当你想要在同一个函数域内间接引用两个指针(或者想访问它们的共享数据)时,如果只是创建指针是安全的。
建议
不要使用类型双关,而是使用c++的union联合类型。