Оптимизируют ли какие-либо компиляторы C или C ++ в макросах определения?

Допустим, у меня в 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 , чтобы квадратный корень вычислялся только один раз во время выполнения?

9
задан Brian Tompsett - 汤莱恩 23 March 2016 в 20:21
поделиться