2012-03-02 55 views
3

我對SLMATH library有問題。不確定是否有人使用它或之前使用過它?無論如何,問題是當我啓用SSE優化(在VS 2010中)編譯時,我顯然必須提供一個容器,它具有正確的SSE類型對象的字節對齊方式。這是好的,因爲SLMATH中有一個類是一個對齊的向量;它對齊8字節邊界上的向量分配(即,我不使用std :: vector <>)。C++ SLMATH庫和SSE優化

現在的問題是,它出現的任何結構或類,包含類似slm :: mat4的東西,也必須在它被放入集合之前在這樣的邊界上對齊。所以,例如,我使用了一個對齊的向量來創建一個slm :: mat4數組,但是如果我創建一個名爲Mesh的類,並且Mesh包含一個slm :: mat4,並且我想將Mesh放入一個std :: vector中,好吧,我在調試時出現奇怪的內存錯誤。

因此,鑑於文檔確實非常稀少,任何使用此庫的人都可以告訴我,我必須做什麼才能將其與SSE優化結合使用?我的意思是我不喜歡這樣的想法:絕對無處不在使用對齊的向量來代替std :: vector,以防slm :: component以某種方式被封裝到類或結構中。

或者,如果周圍有一個像SLMATH一樣好的快速矢量/矩陣/圖形數學庫會很好。

感謝您提供任何建議。

編輯1:不使用SLMATH簡單的攝製情況說明了這個問題:

#include <vector> 

class Item 
{ 

public: 

    __declspec(align(8)) 
    struct { 

     float a, b, c, d; 

    } Aligned; 
}; 


int main() 
{ 
    // Error - won't compile. 

    std::vector<Item> myItems; 
} 

羅賓

回答

1

如果您在聲明的變量使用__declspec(align)你的變量聲明它可能會奏效,或者將它們包裝在一個聲明自己正確對齊的結構中。我沒有使用過這個庫,但似乎這可能是您所面臨的問題。

對齊選項的參考可以找到here

+0

不幸的是,這給std ::編譯錯誤,說當集合調用resize時結構將不會對齊。這對我來說似乎完全合理,但這意味着我可能無法在我的項目中的任何地方使用std容器。 – Robinson 2012-03-02 13:47:42

+0

其實我打算把這個標記爲答案。這是因爲對齊,但這不是我所期望的。 stl不支持它(至少MS版本!)。所以我正在關閉編譯器中的優化。 – Robinson 2012-03-02 15:25:44

+0

一種解決方法是在你的類中提供手動填充,並向STL提供你自己的分配器,以便將新對象放置在128位邊界上。如果你在矩陣中四處移動以使其位於邊界上,即使沒有對齊,它也可以工作。這至少可以說是脆弱的,但它應該按預期運行。 – Dervall 2012-03-02 16:05:01