__atributo__((const)) vs__atributo__((puro)) no GNU C




gcc attributes (2)

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;
}

A diferença é explicada nos manuais do GCC . Mais notavelmente, uma função const pode usar apenas os argumentos passados ​​e não qualquer memória, enquanto uma função pure pode acessar a memória, sob restrições:

O atributo puro proíbe uma função de modificar o estado do programa que é observável por outros meios que não sejam a inspeção do valor de retorno da função. No entanto, as funções declaradas com o atributo puro podem ler com segurança quaisquer objetos não voláteis e modificar o valor dos objetos de uma maneira que não afete o valor de retorno ou o estado observável do programa.

O __attribute__ ((pure)) significa que a função não tem efeitos colaterais e o valor retornado depende dos argumentos e do estado das variáveis ​​globais. Portanto, é seguro que o otimizador exclua algumas chamadas, se os argumentos forem os mesmos, e o chamador não fez nada para alterar o estado dos globais entre as chamadas .

O __attribute__ ((const)) significa que o valor de retorno é apenas uma função dos argumentos e, se algum dos argumentos for ponteiros, os ponteiros não deverão ser desreferenciados .

Uma função const é sempre pure .

Exemplos de funções const seriam as funções abs de <stdlib.h> e algumas funções matemáticas de <math.h> : sqrt , exp , etc. (Embora elas possam estar sujeitas aos modos de arredondamento).

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


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

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

atributo da função __attribute__((const))
Muitas funções examinam apenas os argumentos passados ​​a eles e não têm efeitos, exceto o valor de retorno. Essa é uma classe muito mais rígida que __attribute__((pure)) , porque uma função não tem permissão para ler a memória global. Se uma função é conhecida por operar apenas em seus argumentos, ela pode estar sujeita a eliminação de subexpressão comum e otimizações de loop.

Portanto, TL; DR: __attribute__((const)) é o mesmo que __attribute__((pure)) mas sem acesso a variáveis ​​globais.





gnu