Чистая функция - это подсказка для оптимизирующего компилятора . Возможно, gcc
не заботятся о чистых функциях, когда вы просто передаете ему -O0
(оптимизация по умолчанию). Поэтому, если f
чисто (и определено вне вашей единицы перевода , например, в какой-то внешней библиотеке), компилятор GCC может оптимизировать y = f(x) + f(x);
вчто-то вроде
{
int tmp = f(x); /// tmp is a fresh variable, not appearing elsewhere
y = tmp + tmp;
}
, но если f
является не чистым (что является обычным случаем: представьте, что f
вызывает printf
или malloc
), такая оптимизациязапрещено.
Стандартные математические функции, такие как sin
или sqrt
, являются чистыми (за исключением сумасшествия в режиме округления IEEE, см. http://floating -point-gui.de/ и Fluctuat для более подробной информации), и они достаточно сложны для вычисления, чтобы сделать такие оптимизации полезными.
Вы можете скомпилировать свой код с помощью gcc -O2 -Wall -fdump-tree-all
дляугадайте, что происходит внутри компилятора. Вы можете добавить флаги -fverbose-asm -S
, чтобы получить сгенерированный файл ассемблера *.s
.
Вы также можете прочитать черновой отчет Bismon (особенно его раздел §1.4). Это может дать некоторые интуиции, связанные с вашим вопросом.
В вашем конкретном случае я предполагаю, что gcc
означает вставку ваших звонков;и тогда чистота не имеет значения.
Если у вас есть время, вы можете написать собственный плагин GCC , чтобы сделать такое предупреждение. Вы потратите месяцы на написание этого! Эти старые слайды все еще могут быть вам полезны, даже если детали устарели.
На теоретическом уровне помните о теореме Райса . Следствием этого является то, что совершенная оптимизация чистых функций, вероятно, невозможна.
Имейте в виду ресурсный центр GCC , расположенный в Бомбее.