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 wiki по многоверсионности функций для получения дополнительной информации.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/gcc/Function-Multiversioning.html