В 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
};
Что также не удается скомпилировать, потому что теперь SomeOtherTypeWith16Alignment не может быть передано по значению, поскольку _vectorcall не включен в конструкторе.
Поэтому я вынужден изменить его на это.
struct Vector{
Vector(const SomeOtherTypeWith16Alignment& a);
};
Какие компиляции. Но он больше не использует _vectorcall и, скорее всего, не будет передавать данные в SSE-регистрах, как я бы предпочел...
Итак, почему, черт возьми, я не могу указать соглашение о вызове, используемое конструкторами?
Это может быть специфический для Visual С++ (безусловно, _vectorcall). Я не пробовал это на других компиляторах -