【发布时间】:2013-01-17 20:40:04
【问题描述】:
我跟踪了一个使用 __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
【问题讨论】:
-
一些相关阅读在这里:stackoverflow.com/questions/4424741/…
-
当您取消引用指向
__m128类型的指针时,编译器发出的结果加载/存储函数通常是对齐的种类,因此它假设底层内存对齐为类型需要(在这种情况下为 16 字节对齐)。我猜在容器代码的某个地方,指向__m128的指针被取消引用,并且对齐假设不成立,从而导致分段错误。如果您使用调试器运行程序并在崩溃后检查指针值,您应该能够看到这一点。 -
无论如何都不能访问
m[0]未定义的行为吗? -
我希望对
m[0]的访问不是特别的;我在整个代码中都使用它;您是否有任何建议key==0被保留?
标签: stl sse unordered-map