我已经开始在新的英特尔Sandy Bridge处理器上试用AVX指令。我正在使用MinGW64的GCC 4.5.2,TDM-GCC 64位版本。

我想重载operator <__m256,__m128等打印到控制台。但是我遇到了超负荷的冲突。以下代码中的第二个函数产生错误“与先前的声明void f(__vector(8) float)冲突”:

void f(__m128 v) {
cout << 4;
}

void f(__m256 v) {
    cout << 8;
}


似乎编译器无法区分这两种类型,而将它们都视为f(float __vector)

有没有解决的办法?我无法在线找到任何东西。任何帮助是极大的赞赏。

最佳答案

功能模板存在类似问题时,我不小心偶然发现了答案。在这种情况下,GCC错误消息实际上建议了一种解决方案:

添加-fabi-version=4编译器选项。

这解决了我的问题,并且希望在链接标准库时不会引起任何问题。

您可以在ABI Policy and GuidelinesABI specification上阅读有关ABI(应用程序二进制接口)和GCC的更多信息。 ABI指定在将代码编译成目标文件时如何处理函数名称。显然,默认情况下,GCC使用的ABI版本3无法区分各种向量类型。

09-07 10:24