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
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)等。
| 归档时间: |
|
| 查看次数: |
516 次 |
| 最近记录: |