SSE和C++容器

and*_*ini 10 c++ sse memory-alignment allocator

有以下代码段错误的明显原因吗?

#include <vector>
#include <emmintrin.h>

struct point {
    __m128i v;

  point() {
    v = _mm_setr_epi32(0, 0, 0, 0);
  }
};

int main(int argc, char *argv[])
{
  std::vector<point> a(3);
}
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:我在linux/i686上使用g ++ 4.5.0,我可能不知道我在做什么,但是因为甚至以下的段错误

int main(int argc, char *argv[])
{
  point *p = new point();
}
Run Code Online (Sandbox Code Playgroud)

我真的认为它必须和对齐问题.

Ben*_*igt 11

可能出错的显而易见的事情是,如果v没有正确对齐.

但它是动态分配的vector,所以它不受堆栈错位问题的影响.

但是,正如phooji正确指出的那样,"模板"或"原型"值被传递给std::vector构造函数,该构造函数将被复制到向量的所有元素.它的这个参数std::vector::vector将被放置在堆栈上并且可能未对齐.

一些编译器有一个用于控制函数内堆栈对齐的编译指示(基本上,编译器会根据需要浪费一些额外的空间来使所有本地正确对齐).

根据Microsoft文档,Visual C++ 2010应该为SSE类型自动设置8字节堆栈对齐,并且自Visual C++ 2003以来已经这样做了

对于gcc,我不知道.


在C++ 0x下,对于new point()返回未对齐存储是严重的不合规. [basic.stc.dynamic.allocation]说(来自n3225草案的措辞):

分配功能尝试分配所请求的存储量.如果成功,它将返回存储块的起始地址,其长度以字节为单位应至少与请求的大小一样大.从分配函数返回时,分配的存储的内容没有限制.通过连续调用分配函数分配的存储的顺序,连续性和初始值是未指定的.返回的指针应适当对齐,以便可以将其转换为具有基本对齐要求(3.11)的任何完整对象类型的指针,然后用于访问分配的存储中的对象或数组(直到存储明确解除分配为止)调用相应的释放函数).

并[basic.align]说:

此外,对于无法遵守请求的对齐的动态存储的运行时分配请求应被视为分配失败.

您可以尝试更新版本的gcc吗?