__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).

Другие вопросы по тегам