Я определил функцию
double builtin_test(double y)
{
double x = __builtin_sin(y);
return x;
}
думал, что это должно работать, но при компиляции
C: \ DOCUME ~ 1 \ ADMINI ~ 1 \ USTAWI ~ 1 \ Temp \ ccNuVeYz.o: test6.c :(. Text + 0x5): неопределенный ref
Отношение к греху
как заставить это работать?
Это не ДЕЙСТВИТЕЛЬНО ответ (но вопрос также не совсем ясен) — просто слишком долго для комментария, и я не хочу связывать 2-3 комментария …
Важно понимать, что ОСНОВНАЯ причина __builtin_*
Функция предназначена для поддержки того, что компилятор знает, как это сделать, а иногда это просто вызывает соответствующую стандартную библиотечную функцию, а не делает что-то особенное.
Если мы возьмем sin
В качестве примера, в x87, есть fsin
инструкция, которая может быть сгенерирована. Но если компилятор просто видит кучу математики, он не будет знать, что код делает sin
, поэтому не будет производить fsin
инструкции, просто сделайте кучу умножения, вычитания, сложения и т.д., чтобы выполнить этот расчет. Итак, используя __builtin_sin
внутри стандартной библиотеки или заголовка, например, так:
double sin(double x)
{
return __builtin_sin(x);
}
будет генерировать fsin
инструкция.
Я провел несколько экспериментов с gcc и clang на моей машине, и мне не удалось убедить компилятор действительно вычислить грех во время выполнения и НЕ вызывать sin
функция. Clang-версия кода решила рассчитать стоимость всех моих циклов sin
значения в константу — это, конечно, хорошая победа над выполнением 100 вычислений, но не совсем то, что мы ищем.
Обратите внимание, что fsin
инструкция довольно медленная, и выполнение отдельных шагов вычисления с использованием простых инструкций может быть одинаково быстрым, но мы не хотим указывать это каждый раз sin
используется (и, конечно, не хочу, чтобы компилятор «знал», как это сделать).