小编Sid*_*obe的帖子

如果在调试器中运行,则Visual Studio中的数据未正确对齐

我已经和SSE合作了一段时间了,我已经看到了我的对齐问题.然而,这超出了我的理解:

无论我是使用F5(调试)运行程序还是在调试器外运行它(Ctrl + F5),我都会得到不同的对齐方式!

一些背景信息:我正在使用包装器来启用SSE数据类型 - 使用重载运算符和自定义分配器(重载new和delete运算符使用_mm_malloc和_mm_free).但是在下面的例子中,我已经设法进一步减少问题,即即使我不使用自定义分配器也会发生问题.

如下所示,在main()中,我在堆上动态分配一个TestClass对象,该对象包含一个SSEVector类型对象.我正在使用一个虚拟float[2]成员变量来"错位"堆栈.

当我使用F5运行时,我获得以下输出:

object address 00346678
_memberVariable1 address 00346678
_sseVector address 00346688
Run Code Online (Sandbox Code Playgroud)

如果我使用Ctrl + F5运行:

object address 00345B70
_memberVariable1 address 00345B70
_sseVector address 00345B80
Run Code Online (Sandbox Code Playgroud)

如您所见,当我在调试器中运行它时,对齐方式是不同的(即不是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() { …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction sse alignment visual-studio

1
推荐指数
1
解决办法
3359
查看次数