Querendo entender melhor constantes em C [RESOLVIDO]

1. Querendo entender melhor constantes em C [RESOLVIDO]

Apprentice X
ApprenticeX

(usa Slackware)

Enviado em 15/01/2022 - 02:59h

Bom dia a Todos
Tentando entender a declaração de constantes.

Entendi que declarar char ou const char não muda nada em questão de desempenho em meu código, sendo apenas uma questão estética!
Porém se eu declaro #define VERSION 1.0 entendi que isso não consome RAM, visto que o compilador vai modificar todos os valores no código inexistindo a variável VERSION

Então no caso acima eu teria sim um desempenho melhor no meu código declarando uma constante usando #define
Estou certo disso?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 18/01/2022 - 05:25h

Acrescentando algumas informações...

No caso do seu exemplo, em particular, no qual você usou uma constante do tipo double, nem ao menos é verdade que a constante é embutida no código e, por isso, não ocuparia espaço extra.

Imagine o seguinte código, muito reduzido (e incompleto, mas suficiente como exemplo do que eu quero mostrar).
#define VERSION 1.0
static const double UNIT=1.0;

void f(double);

int main(void){
f(VERSION);
f(UNIT);
}

Se você compilar esse código, convertendo-o para Assembly e com comentários (e.g. “gcc -c -S -fverbose-asm -Wextra -Werror -pedantic-errors -O0 arquivo.c”), e examinar o código gerado, vai ver que a constante 1.0 será colocada duas vezes na seção .rodata (de read-only data, para dados que não serão modificados): uma vez para o símbolo UNIT e uma vez associada a um objeto “anônimo” (a que o compilador vai atribuir o nome interno “.LC0”).

Entretanto, esse mesmo código é afetado drasticamente por opções de otimização (experimente trocar aquele “-O0” por outros valores, e compare o Assembly gerado).


Então, no fim das contas, o esparado ganho que você achava que poderia existir no seu código provavelmente não existe — pelo menos não naquele caso em particular.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Querendo entender melhor constantes em C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/01/2022 - 09:07h

ApprenticeX escreveu:

Bom dia a Todos
Tentando entender a declaração de constantes.

Entendi que declarar char ou const char não muda nada em questão de desempenho em meu código, sendo apenas uma questão estética!


Não é somente estética. Dizer que um objeto é constante faz com que o compilador restrinja as operações que você pode fazer sobre ele. Mesmo que o tempo de acesso não mude em relação a algo que não tem o atributo de constante para as operações que são válidas sobre ambos os tipos, o conjunto dessas operações muda.

Porém se eu declaro #define VERSION 1.0 entendi que isso não consome RAM, visto que o compilador vai modificar todos os valores no código inexistindo a variável VERSION

Então no caso acima eu teria sim um desempenho melhor no meu código declarando uma constante usando #define
Estou certo disso?


Tudo tem vantagens e desvantagens. Teve um tópico com uma pergunta semelhante, ao qual eu respondi com alguns aspectos. Veja se ajuda https://www.vivaolinux.com.br/topico/C-C++/Duvidas-com-define-const-globais.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts