Я был недоволен решением изменить флаги ABI компилятора для решения этой проблемы, поэтому я отправился на поиски другого решения. Кажется, они столкнулись с этой проблемой при написании библиотеки Eigen - подробности см. В этом исходном файле http://eigen.tuxfamily.org/dox-devel/SSE_2PacketMath_8h_source.html
Мое решение это слегка подправленная версия:
template <typename T, unsigned RegisterSize>
struct Register
{
using ValueType = T;
enum { Size = RegisterSize };
inline operator T&() { return myValue; }
inline operator const T&() const { return myValue; }
inline Register() {}
inline Register(const T & v) : myValue(v) {} // Not explicit
inline Register & operator=(const T & v)
{
myValue = v;
return *this;
}
T myValue;
};
using Register4 = Register<__m128, 4u>;
using Register8 = Register<__m256, 8u>;
// Could provide more declarations for __m128d, __m128i, etc. if needed
Используя вышеизложенное, вы можете перегружать Register4
, Register8
и т. Д. Или создавать шаблонные функции за Register
с, не сталкиваясь с проблемами связывания и не меняя настроек ABI.