__attribute__((const)) против __attribute__((pure)) в GNU C
В чем разница между __attribute__((const))
а также __attribute__((pure))
в GNU C?
__attribute__((const)) int f() {
/* ... */
return 4;
}
против
__attribute__((pure)) int f() {
/* ... */
return 4;
}
2 ответа
Из документации к компилятору ARM (которая основана на gcc):
__attribute__((pure))
атрибут функции
Многие функции не имеют никаких эффектов, кроме как для возврата значения, и их возвращаемое значение зависит только от параметров и глобальных переменных. Такие функции могут быть предметом анализа потока данных и могут быть исключены.
__attribute__((const))
атрибут функции
Многие функции проверяют только переданные им аргументы и не имеют никаких эффектов, кроме возвращаемого значения. Это гораздо более строгий класс, чем__attribute__((pure))
потому что функции не разрешено читать глобальную память. Если известно, что функция работает только со своими аргументами, то она может быть подвергнута общему исключению подвыражения и оптимизации цикла.
Итак, TL;DR: __attribute__((const))
такой же как __attribute__((pure))
но без какого-либо доступа к глобальным переменным.
Разница объясняется в руководствах GCC
__attribute__ ((pure))
означает, что функция не имеет побочных эффектов, а возвращаемое значение зависит от аргументов и состояния глобальных переменных. Поэтому оптимизатор может исключить некоторые вызовы, если аргументы совпадают, а состояние глобалов между вызовами не изменилось.
__attribute__ ((const))
означает, что возвращаемое значение является исключительно функцией аргументов, и если какой-либо из аргументов является указателем, указатели не должны быть разыменованы.
const
функция всегда pure
,
Примеры const
функции будут abs
функции от <stdlib.h>
и некоторые математические функции из <math.h>
: sqrt
, exp
и т. д. (хотя они могут подвергаться режимам округления).
Примеры pure
но неконстантные функции будут такими функциями, как strlen
- поскольку это разыменовывает указатель, переданный в.
Обратите внимание, что если функции передается указатель и проверяется контекст этого указателя, она не может быть объявлена const
, даже если переданный указатель и контексты указателя const
, Это серьезное ограничение полезности const
,
Вы можете вернуть несколько значений в C, используя структуру, которая упрощает использование pure
, (Более типично использовать операнды возврата указателя, но это прерывает использование pure
).