5

我跟踪了一个使用 __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

4

2 回答 2

3

关于对齐有2个问题:

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

全局new运算符是否返回适合__m128类型对齐的内存?即,返回 16 字节对齐的内存。

于 2013-02-02T22:57:55.960 回答
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) 等。

于 2013-02-11T00:36:49.123 回答