在Visual Studio 2013中,存在一种新的调用约定_vectorcall
。它旨在与可以传递到SSE寄存器中的SSE数据类型一起使用。
您可以像这样指定成员函数的调用约定。
struct Vector{//a 16 byte aligned type
_m128i _vectorcall operator *(Vector a);
};
这段代码可以正常运行,可以进行编译,即使需要16字节对齐也可以通过传值方式传递类型。
但是,如果我试图将其附加到任何构造函数上(这似乎非常合理),它会失败。
struct Vector
_vectorcall Vector(SomeOtherTypeWith16Alignment a);
};
编译器会弹出警告消息(我将警告视为错误):
警告 C4166:构造函数/析构函数的调用约定非法。
这迫使我将代码更改为以下内容:
struct Vector{
Vector(SomeOtherTypeWith16Alignment a); //fails to compile
};
由于现在构造函数上未启用 _vectorcall
,所以也无法编译通过,因为无法按值传递 SomeOtherTypeWith16Alignment
。
所以我被迫将其更改为这样。
struct Vector{
Vector(const SomeOtherTypeWith16Alignment& a);
};
这段代码可以编译通过。但是它不再使用_vectorcall
,也不太可能像我想的那样通过SSE寄存器传递数据...
基本上,我为什么不能指定构造函数使用的调用约定呢?
这可能是特定于Visual C++的(_vectorcall
肯定是)。我没有在其他编译器上尝试过这个方法--