我对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;
}
罗宾
不幸的是,这给std ::编译错误,说当集合调用resize时结构将不会对齐。这对我来说似乎完全合理,但这意味着我可能无法在我的项目中的任何地方使用std容器。 – Robinson 2012-03-02 13:47:42
其实我打算把这个标记为答案。这是因为对齐,但这不是我所期望的。 stl不支持它(至少MS版本!)。所以我正在关闭编译器中的优化。 – Robinson 2012-03-02 15:25:44
一种解决方法是在你的类中提供手动填充,并向STL提供你自己的分配器,以便将新对象放置在128位边界上。如果你在矩阵中四处移动以使其位于边界上,即使没有对齐,它也可以工作。这至少可以说是脆弱的,但它应该按预期运行。 – Dervall 2012-03-02 16:05:01