2013-07-26 31 views
-1

我創建了一個支持SSE的矢量類。創建對象時發生SSE訪問衝突

我在週期性調用的回退函數中創建它的一個實例,導致在程序開始時崩潰。在宣佈它是全球性的情況下,這個問題不會發生。

錯誤消息:過程返回-1073741819(0000005)執行 時間:3.471小號

這裏是簡化的類:

#include <mmintrin.h> 

alignas(16) class v3 
{ 
    public: 

    // constructors 
    inline v3() : m(_mm_setzero_ps()) {} 
    inline v3(float x, float y, float z) : m(_mm_set_ps(0, z, y, x)) {} 

    inline v3(__m128 m) : m(m) {} 


    // Member variables 
    union 
    { 
     struct { float x, y, z; }; 
     __m128 m; 
    }; 
}; 

任何想法?

+1

什麼是錯誤信息?代碼中的哪個部分會引發? –

+0

程序返回-1073741819(0xC0000005)執行時間:3.471秒 它在程序開始時發生的相對較多。 – plasmacel

+0

您應該在調試器中運行您的程序,然後提供發生崩潰的代碼。很有可能遇到錯位問題。 – Anycorn

回答

1

錯誤代碼0xC0000005是訪問衝突。當涉及SSE時,總是意味着您嘗試訪問未對齊的內存。您需要確定哪些操作使用未對齊的操作數。

+0

沒有操作,我只是創建一個對象。 – plasmacel

+1

@plasmacel ...並運行其默認構造函數。 – Casey

+0

我做了以下行(導致錯誤):v3 testvec; – plasmacel

0

我假設你使用的是Visual C++,因爲你提到了Windows風格的錯誤代碼。根據MSDN,Visual C++不支持alignasalignof。使用std::aligned_storage可能會帶來更好的運氣,例如:

union { 
    _m128 m; 
    struct { float x,y,z }; 
    std::aligned_storage<16> storage; 
}; 
+0

我使用GCC,因此得到支持。爲了向後兼容,我製作了一個編譯器屬性宏。 – plasmacel