Примите во внимание следующее:
// foo.h
class Foo
{
public:
int x = 2;
int y = 3;
void DoSomething_SSE();
void DoSomething_AVX();
// ( Implicit default constructor is generated "inline" here )
};
// Foo_AVX.cpp, compiled with -mavx or /arch:AVX
void Foo::DoSomething_AVX()
{
// AVX optimised implementation here
}
// Foo_SSE.cpp, compiled with -msse2 or /arch:SSE2
void Foo::DoSomething_SSE()
{
// SSE optimised implementation here
}
Вот проблема: компилятор сгенерирует подразумеваемый конструктор по умолчанию с семантикой «inline» (примечание: встроенная семантика не означает, что функция будетобязательно должен быть встроен) в каждом модуле перевода, и - в тех случаях, когда конструктор не встроен - компоновщик затем выберет одну реализацию и откажется от другой.
Если компоновщик выбирает конструктор, сгенерированный в модуле компиляции AVXэтот код будет аварийно завершен с недопустимой инструкцией на компьютере, который не поддерживает AVX.
Можно остановить аварийное завершение, добавив явный конструктор по умолчанию, либо __forceinline (чтобы убедиться, что он встроен один разза единицу компиляции) или объявлено в заголовке и определено в единице компиляции, которая компилируется с набором команд с наименьшим общим знаменателем.
Однако, безусловно, есть способ заставить язык справиться с этим лучше, чем необходимостьнаписать фиктивные функции ..?
(llvm-clang ++ 9.xx / x64 в Mac OS X)