上交所和C集装箱
是否有明显的原因为什么以下代码segfaults?
#include <vector> #include <emmintrin.h> struct point { __m128i v; point() { v = _mm_setr_epi32(0,0); } }; int main(int argc,char *argv[]) { std::vector<point> a(3); } 谢谢 编辑:我在linux / i686上使用g 4.5.0,可能不知道我在做什么,但是即使是以下的segfaults int main(int argc,char *argv[]) { point *p = new point(); } 我真的认为必须和对齐问题. 解决方法
可能会出错的明显的事情是,如果v没有正确对齐.
但是它由向量动态分配,所以它不会受到堆栈不对齐问题的影响. 但是,正如phooji正确指出的那样,一个“模板”或“原型”值被传递给std :: vector构造函数,它将被复制到向量的所有元素.这是std :: vector :: vector的这个参数,它将被放置在堆栈上,并且可能不对齐. 一些编译器有一个用于在一个函数内控制堆栈对齐的编译指示(基本上,编译器根据需要浪费一些额外的空间,使所有本地人正确对齐). 根据Microsoft文档,Visual C++ 2010 should set up 8 byte stack alignment automatically for SSE types和has done so since Visual C++ 2003 对于gcc我不知道. 在C 0x下,对于新点()返回未对齐的存储是严重违规. [basic.stc.dynamic.allocation]说(草案n3225的措辞):
和[basic.align]说:
你可以尝试一个更新版本的gcc,这可能在哪里修复? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |