有一些非常奇怪的问题,作为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”),那么这也可能会起作用。否则,您将在最深处的游泳池中潜水。

10-07 18:40