2010-07-10 48 views
4

對齊有一些非常奇怪的問題,並作爲初學者與c + +我不知道爲什麼。SSE與類

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 var未正確對齊。

但是,只有在32位模式下編譯。在64位模式下工作良好...

任何線索?我錯過了明顯的東西?

+0

什麼編譯器? – 2010-07-10 19:51:56

+0

microsoft vC++ 2010 – feal87 2010-07-10 20:06:51

回答

4

align declspec只保證__m128i相對於數據結構的開始對齊。如果您的內存分配器首先創建的對象不是16字節對齊的,則__m128i將會嚴重錯位。許多現代的內存分配器只給出8字節對齊。

您需要重載DXPoint的operator new以使用具有更好對齊控制的分配器,或者使用靜態分配且正確對齊的__m128is,或者找到其他解決方案。

-

對不起,忽略了你的問題的 「C++初學者」 的一部分。運算符新的重載和自定義內存分配器並不是真正的C++初學者主題。如果您的應用程序可以靜態分配DXPoint/DXSize對象(即作爲全局變量而不是'new'),那麼這也可能起作用。否則,你會在深水池裏潛水。

+0

通過對齊所有使用不處於指針模式的SSE類的類來解決。 :P – feal87 2010-07-11 11:53:12