数据不如果调试器中运行在Visual Studio中正确对齐(Data not aligned co

2019-09-30 22:17发布

我一直在与SSE,而现在,我已经看到我的对齐问题的份额。 然而,这超出了我的理解:

我得到不同的比对是否使用我F5(调试)运行的程序或我是否运行调试器(Ctrl + F5键)外!

一些背景信息:我使用的包装为启用SSE-数据类型-用重载运算符和自定义分配器(重载newdelete使用运营商_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;
}

任何提示或评论高度赞赏。 提前致谢。

Answer 1:

当调试器下运行,您使用的调试堆,这可能会影响对齐。

设置_NO_DEBUG_HEAP=1在您的环境设置,看看是否有所帮助。

例如参见http://msdn.microsoft.com/en-us/library/aa366705%28v=vs.85%29.aspx

然而,使用malloc或新分配时对齐不能保证。 在VS解决这个的“正确”的方法是使用_aligned_malloc

如果你希望你的SSEVector为另一种结构中的一员,你需要(使用#pragma包)来改变这种结构的包装 ,或__declspec SSEVector的(调整)。

请参阅如何对齐数据打包工程

会发生什么事在你的情况是(除了看似巧合的调试/非调试器的区别):

SSEVector声明未对齐。 如果您使用直接分配它_aligned_malloc ,它会对齐。 TestClass也未对齐,并使用默认的包装。 如果您在使用它分配_aligned_malloc ,在TestClass实例将被正确对齐。 因为你希望这不会帮助你在所有的, SSEVector 成员变量要对齐。

添加上的对准要求SSEVector使用__declspec(align)将告诉编译器SSEVector堆栈变量必须对准, SSEVector作为结构成员必须在结构/类范围内排列。 现在,如果你分配一个TestClass使用_aligned_malloc ,将正确对齐。 而SSEVector在结构失调也正确由于declspec对齐,所以SSEVector的绝对地址将是正确的为您的使用。



文章来源: Data not aligned correctly in Visual Studio if run in debugger