我已经开始在新的英特尔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 Guidelines和ABI specification上阅读有关ABI(应用程序二进制接口)和GCC的更多信息。 ABI指定在将代码编译成目标文件时如何处理函数名称。显然,默认情况下,GCC使用的ABI版本3无法区分各种向量类型。