__attribute __ ((const)) __attribute __ ((pure)) no GNU C

Qual é a diferença entre __attribute__((const)) e __attribute__((pure)) no GNU C?

 __attribute__((const)) int f() { /* ... */ return 4; } 

vs

 __attribute__((pure)) int f() { /* ... */ return 4; } 

Na documentação do compilador ARM (que é baseado no gcc):

__attribute__((pure)) atributo de function
Muitas funções não têm efeitos, exceto para retornar um valor, e seu valor de retorno depende apenas dos parâmetros e das variables ​​globais. Funções desse tipo podem estar sujeitas à análise do stream de dados e podem ser eliminadas.

atributo de function __attribute__((const))
Muitas funções examinam apenas os argumentos passados ​​para elas e não têm efeitos, exceto o valor de retorno. Esta é uma class muito mais rigorosa do que __attribute__((pure)) , porque uma function não tem permissão para ler a memory global. Se uma function é conhecida por operar apenas em seus argumentos, ela pode estar sujeita a eliminação de sub-expressões comuns e otimizações de loop.

Portanto, TL; DR: __attribute__((const)) é o mesmo que __attribute__((pure)) mas sem access a variables ​​globais.

A diferença é explicada nos manuais do CCG

O __attribute__ ((pure)) significa que a function não possui efeitos colaterais e o valor retornado depende dos argumentos e do estado das variables ​​globais. Portanto, é seguro para o otimizador elidir algumas chamadas para ele, se os argumentos forem os mesmos, e o estado dos globals não mudou entre as chamadas.

O __attribute__ ((const)) significa que o valor de retorno é apenas uma function dos argumentos, e se qualquer um dos argumentos são pointers, então os pointers não devem ser desreferenciados .

Uma function const é sempre pure .

Exemplos de funções const seriam as funções matemáticas de : sqrt , exp , etc. (embora possam estar sujeitas a modos de arredondamento).

Exemplos de funções pure mas não constantes, seriam funções como strlen – como desreferencia o ponteiro passado.