4

いくつかの本当に奇妙な問題があり、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ビットモードで正常に動作します...

手がかりはありますか?明らかな何かが欠けていますか?

4

1 に答える 1

4

align declspecは、__m128iがデータ構造の開始に対して整列されることを保証するだけです。メモリアロケータが最初に16バイトに整列されていないオブジェクトを作成する場合、__m128iは慎重に整列されません。最近の多くのメモリアロケータは、8バイトのアライメントしか提供しません。

DXPointの新しい演算子をオーバーロードして、より適切な配置制御を備えたアロケータを使用するか、静的に割り当てられて正しく配置された__m128isを使用するか、他の解決策を見つける必要があります。

-

申し訳ありませんが、質問の「C++初心者」の部分を見落としていました。演算子の新しいオーバーロードとカスタムメモリアロケータは、実際にはC++の初心者向けトピックではありません。DXPoint / DXSizeオブジェクトを静的に(つまり、「new」ではなくグローバルとして)割り当てることができるようなアプリケーションの場合は、それも機能する可能性があります。それ以外の場合は、最深部のプールでダイビングしています。

于 2010-07-10T19:55:34.357 に答える