STL unordered_map与__m128值崩溃

时间:2013-02-02 18:08:18

标签: stl sse unordered-map

我跟踪了一个错误,即使用__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;
}

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

2 个答案:

答案 0 :(得分:3)

关于对齐有两个问题:

ABI是否确保__m128变量始终在堆栈上对齐?

全局new运算符是否为__m128类型返回内存?即,以16字节对齐方式返回内存。

答案 1 :(得分: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)等。