【发布时间】:2011-07-10 02:52:50
【问题描述】:
下面的代码段错误有明显的原因吗?
#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);
}
谢谢
编辑:我在 linux/i686 上使用 g++ 4.5.0,我可能不知道我在这里做什么,但因为即使是以下段错误
int main(int argc, char *argv[])
{
point *p = new point();
}
我真的认为这一定是和对齐问题。
【问题讨论】:
-
如果
v没有正确对齐,那么明显可能出错的事情。但它是由vector动态分配的,因此不会出现堆栈错位问题。尽管如此,我还是会在尝试分配之前打印出v的地址,以确保。 -
顺便说一句,当您看到段错误时,最好提及您正在使用的编译器、版本和平台。我会尝试重现您的错误,但在不知道具体细节的情况下我无法重现。
-
32 位堆分配器的对齐方式不超过 8。您需要使用 vector 的分配器类型参数并使用可以在 16 处对齐的分配器。检查您的 CRT 是否为 1 或做饭过度分配你自己的。
标签: c++ sse memory-alignment allocator