STL unordered_map与__m128值崩溃

Hug*_*ues 5 stl unordered-map sse

我跟踪了一个错误,即使用__m128(SSE向量)作为std :: unordered_map中的值.这会导致mingw32 g ++ 4.7.2的运行时分段错误.

请参阅下面的示例.这有什么理由会失败吗?或者,可能有一个解决方法?(我尝试将值包装在一个类中,但它没有帮助.)谢谢.

#include <unordered_map>
#include <xmmintrin.h>          // __m128
#include <iostream>

int main()
{
    std::unordered_map<int,__m128> m;
    std::cerr << "still ok\n";
    m[0] = __m128();
    std::cerr << "crash in previous statement\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译设置:g ++ -march = native -std = c ++ 11

Mar*_*sse 2

C++ 目前不处理过度对齐类型的动态分配。对于通常的 x86 ABI,标准对齐方式是 8,而 __m128 的对齐方式是 16 字节,因此它是过度对齐的。对于通常的 x86_64 ABI,标准对齐为 16,这使得 __m128 安全(但 __m256 因其 32 字节对齐而再次不安全)。

请参阅本文,了解下一个标准中可能的更改,这将使事情“正常工作”: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3396.htm

同时,您可以指定自己的分配器,例如基于aligned_alloc(C11)、posix_memalign(unix)、_aligned_malloc(Microsoft)等。