Принятый ответ хороший, но я хотел бы добавить:
function_that_takes_a_lot_of_time_to_compute()
или +[NSString stringWithFormat:]
могут иметь побочные эффекты, поэтому даже если мы знали со 100% уверенностью, что nil_array
было nil
(а мы можем иногда знать это через статический анализ), программе все равно придется выполнить function_that_takes_a_lot_of_time_to_compute()
и +[NSString stringWithFormat:]
, чтобы убедиться, что она работает так, как ожидалось.
ЕслиФункция f()
не имеет побочных эффектов, она считается «чистой».Это означает, что он может принимать входные аргументы и может возвращать значение, но он никогда не вызывает какие-либо не чистые функции и никогда не изменяет какую-либо часть программы или глобальную память (память, участвующая в передаче аргументов и возвращаемых значений, здесь не учитывается.) Следующая функция, например, «pure»:
int munge(float foo, char bar) {
unsigned short quux = bar << 4;
return foo + quux;
}
Примерами чистых функций в стандартной библиотеке C являются memcmp()
и strlen()
.
Еслии только если известно, что функция является чистой , компилятор может безопасно оптимизировать вызовы к ней, поскольку , а не , вызывающая ее, не будет влиять на остальную часть программы.Однако GCC очень консервативен в этом и обычно (всегда?) Делает это только тогда, когда функция помечена как помечена как , через декорацию __attribute__((__pure__))
в объявлении функции.
Еслифункция является чистой и, кроме того, никогда не разыменовывает указатели и никогда не обращается к какой-либо памяти за пределами своего стекового фрейма; вместо этого ее можно пометить __attribute__((__const__))
в GCC, что позволяет проводить еще более статический анализ и оптимизацию.