7.8 Функции с множественными версиями
С помощью фронтенда GNU C++, для целей x86, можно указать несколько версий функции, где каждая функция специализируется на определённом функциональном свойстве целевой платформы. Во время выполнения, соответствующая версия функции автоматически выполняется в зависимости от характеристик платформы исполнения. Вот пример.
__attribute__ ((target ("default")))
int foo ()
{
// The default version of foo.
return 0;
}
__attribute__ ((target ("sse4.2")))
int foo ()
{
// foo version for SSE4.2
return 1;
}
__attribute__ ((target ("arch=atom")))
int foo ()
{
// foo version for the Intel ATOM processor
return 2;
}
__attribute__ ((target ("arch=amdfam10")))
int foo ()
{
// foo version for the AMD Family 0x10 processors.
return 3;
}
int main ()
{
int (*p)() = &foo;
assert ((*p) () == foo ());
return 0;
}
В приведённом примере создаются четыре версии функции foo. Первая версия foo с атрибутом целевой платформы «default» — это версия по умолчанию. Эта версия выполняется, когда ни одна другая версия, специфичная для целевой платформы, не подходит для выполнения на конкретной платформе. Новая версия foo создаётся путём использования того же сигнатура функции, но с другим значением строки целевой платформы. Функция foo вызывается или к ней берётся указатель, как и к обычной функции. GCC позаботится о переключении и вызове правильной версии во время выполнения. Обратитесь к вики-странице GCC по функциям с множественными версиями для получения более подробной информации.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Function-Multiversioning.html