有一些非常奇怪的问题,作为c++的初学者,我不知道为什么。
struct DeviceSettings
{
public:
....somevariables
DXSize BackbufferSize;
....somemethods
};
struct DXPoint;
typedef DXPoint DXSize;
__declspec(align(16)) struct DXPoint
{
public:
union
{
struct
{
int x;
int y;
};
struct
{
int width;
int height;
};
int dataint[2];
__m128i m;
};
DXPoint(void);
DXPoint(int x, int y);
~DXPoint(void);
void operator = (const DXPoint& v);
};
由于某种原因,当我声明DeviceSettings时,应用程序崩溃导致DXSize变量未正确对齐。
但这仅在32位模式下编译。在64位模式下工作正常...
有什么线索吗?我缺少明显的东西吗?
最佳答案
align declspec仅保证__m128i相对于数据结构的开始对齐。如果您的内存分配器创建的对象最初不是16字节对齐的,则__m128i会被小心地错位。许多现代内存分配器仅提供8字节对齐。
您将需要为DXPoint重载new运算符,以使用具有更好的对齐控制的分配器,或使用静态分配且正确对齐的__m128is,或找到其他解决方案。
-
抱歉,忽略了您问题的“C++初学者”部分。运算符,新的重载和自定义内存分配器并不是真正的C++初学者主题。如果您的应用程序可以静态分配DXPoint / DXSize对象(即,以全局变量代替“new”),那么这也可能会起作用。否则,您将在最深处的游泳池中潜水。