Допустим, у меня в C или C ++ есть следующее:
#include <math.h>
#define ROWS 15
#define COLS 16
#define COEFF 0.15
#define NODES (ROWS*COLS)
#define A_CONSTANT (COEFF*(sqrt(NODES)))
Затем я использую УЗЛЫ
и A_CONSTANT
где-то глубоко внутри множества вложенных циклов (т.е. используются много раз). Ясно, что оба имеют числовые значения, которые можно определить во время компиляции, но действительно ли компиляторы это делают? Во время выполнения ЦП должен будет оценивать 15 * 16
каждый раз, когда он видит УЗЛЫ
, или компилятор статически поместит туда 240
? Точно так же будет ли процессор вычислять квадратный корень каждый раз, когда он видит A_CONSTANT
?
Я предполагаю, что умножение ROWS * COLS
оптимизировано, но ничего другого нет. Целочисленное умножение встроено в язык, но sqrt - это библиотечная функция. Если это действительно так, есть ли способ получить магическое число, эквивалентное A_CONSTANT
, чтобы квадратный корень вычислялся только один раз во время выполнения?