我跟踪了一个错误,即使用__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
答案 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)等。