我一直在与SSE,而现在,我已经看到我的对齐问题的份额。 然而,这超出了我的理解:
我得到不同的比对是否使用我F5(调试)运行的程序或我是否运行调试器(Ctrl + F5键)外!
一些背景信息:我使用的包装为启用SSE-数据类型-用重载运算符和自定义分配器(重载new
和delete
使用运营商_mm_malloc
和_mm_free
)。 但在下面的例子中,我已经成功地减少问题甚至进一步,即问题也会发生,即使我不使用自定义的分配器。
正如下面可以看到,在主()我动态地分配在堆上,其中包含一个SSEVector类型对象识别TestClass对象。 我使用虚设float[2]
成员变量“missalign”堆栈中的位。
我得到下面的输出,当我与F5运行:
object address 00346678
_memberVariable1 address 00346678
_sseVector address 00346688
如果我用Ctrl + F5运行:
object address 00345B70
_memberVariable1 address 00345B70
_sseVector address 00345B80
正如你所看到的,对齐方式是不同的(即不是16个字节),当我在调试器中运行。 难道只是一个巧合对准用Ctrl-F5的时候是正确的? 我使用Visual Studio 2010中有一个新的项目(默认设置)。
如果我宣布堆栈,即对对象TestClass myObject;
这个问题不会出现。 使用__declspec(align(16))
没有帮助,无论是。
该代码我用来重现该问题:
#include <iostream>
#include <string>
#include <xmmintrin.h> // SSE
//#include "DynAlignedAllocator.h"
//////////////////////////////////////////////////////////////
class SSEVector /*: public DynAlignedAllocator<16>*/
{
public:
SSEVector() { }
__m128 vec;
};
class TestClass
{
public:
TestClass() { }
/*__declspec(align(16))*/ float _memberVariable1 [2];
SSEVector _sseVector;
};
//////////////////////////////////////////////////////////////
int main (void)
{
TestClass* myObject = new TestClass;
std::cout << "object address " << myObject << std::endl;
std::cout << "_memberVariable1 address " << &(myObject->_memberVariable1) << std::endl;
std::cout << "_sseVector address " << &(myObject->_sseVector) << std::endl;
delete myObject;
// wait for ENTER
std::string dummy;
std::getline(std::cin, dummy);
return 0;
}
任何提示或评论高度赞赏。 提前致谢。