动态分配的内存未在SSE中对齐

时间:2015-01-13 14:41:10

标签: c++ sse simd avx

这是正常工作的代码:

char a[100];
for (int i = 0; i < 100; i++)
     a[i] = 0;
__m128i x = _mm_load_si128((__m128i *) a);

但如果我动态分配内存,VS 2013将会中断:

char *a = new char[100];
for (int i = 0; i < 100; i++)
     a[i] = 0;
__m128i x = _mm_load_si128((__m128i *) a);

如何同时使用动态内存和对齐加载指令?

2 个答案:

答案 0 :(得分:2)

因为sizeof返回char指针的大小:4个字节。

答案 1 :(得分:0)

你可以操纵new运算符来返回对齐的内存(这可能不是最好的维护方式),或者你可能会分配更多的内存并只对它的对齐部分进行操作。例如,如果需要在8字节偶数地址上进行对齐,则再分配8个字节,并按照以下方式处理对齐的指针。

char* a;
uintptr_t unaligned = (uintptr_t)a;
uintptr_t aligned = ( unaligned % 8 ) ? unaligned : ( unaligned % 8 ) + 8;
char* a_aligned = (char*)aligned;

类型uintptr_tstdint.h中定义。