最近我想出了以下技巧:
template<typename T> class Vector<4,T>
{
public:
T x;
T y;
T z;
T w;
Vector<2,T>& upperLeft=*((Vector<2,T>*)(&x));
Vector<2,T>& lowerRight = *((Vector<2, T>*)(&z));
/*rest of class */
}
我是否应该期望将来任何隐藏的问题会从该代码中字节我的后端?
编辑:这就是 Vector<2,T> 的样子:
template<typename T> class Vector<2,T>
{
public:
T x;
T y;
/*methods*/
}
哦,
上帝
是的。您目前依赖于未定义的行为。除了依赖于两个类的确切布局(包装可能会在这里咬你),你还依赖于类型双关语。这违反了严格的别名,除了 UB 之外,左上角成员中可能没有对 X 或 Y 的更改。
也就是说,在打包#pragma
和Visual Studio的-fno-strict-aliasing
版本之间,在给定具有特定优化/布局/等标志的特定版本的编译器的情况下,您可以依赖它工作。但是这段代码将非常特定于编译器。