[Ling C.] 'const' e ottimizzazione in fase di compilazione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
crisixk
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1402
Iscrizione: domenica 17 maggio 2009, 1:15
Località: Pontedera - Pisa
Contatti:

[Ling C.] 'const' e ottimizzazione in fase di compilazione

Messaggio da crisixk »

Ciao raga  :P

domanda:

mettiamo che scrivo un programma che dichiari una variabile const int con il valore 1, poi attraverso i cast modifico tale valore in 2, il compilatore potrebbe risentirne?

Nel senso: se il compilatore per ottimizzare l'eseguibile, trovando la dichiarazione const int crea un blocco non modificabile, la modifica di tale blocco attraverso i cast può generare bug?

Premesso che non conosco l'assembler e il come funzioni un eseguibile dopo la compilazione resta per me ancora un mistero .. esempio (in C):

Codice: Seleziona tutto

int main ( void )
{
    const int var = 1;

    ..... vario codice .....

    *((int*)&var) = 2;

    ..... vario codice .....

    return 0;
}
bye  :(
Avvolte cio' che si crea per facilitarci la vita, ci libera dal ragionare ed insieme ci imprigiona in una sorta di limbo nel quale la coscienza è solo un limite, uno spreco di risorse e tempo. Cosa fa' la mia mano ?
... s'impara un passo alla volta ...
Ashura
Prode Principiante
Messaggi: 199
Iscrizione: venerdì 13 ottobre 2006, 9:55

Re: [Ling C.] 'const' e ottimizzazione in fase di compilazione

Messaggio da Ashura »

Lasciando perdere il fatto che e' abbastanza una porcheria utilizzare il C-cast per togliere il constness di una variabile,

( in C++ hanno introdotto il const_cast per questo )

il compilatore non ha nessun problema; una volta che lo fai contento con il cast lui ti permette di assegnare quel valore senza opposizione.

Quando il compilatore trova una variabile 'const' non crea nessun 'blocco non modificabile' ( non esiste un concetto del genere ) ma piazza quella variabile nello stack. Si segna pero' nella sua virtual table che quella variabile e' una costante.

Questo protegge il programmatore da eventuali 'sbagli di distrazione', ma ovviamente non gli impedisce di cambiarne il valore volutamente come hai fatto tu.

Quindi no bugs per il compilatore, no bugs per il linker, no bugs per la CPU :)

Pero' il bug ce lo puoi mettere te... prendi questo esempio:

Codice: Seleziona tutto

const int len = 50;
char* mystr = (char*)malloc(len);

... codice ...

*((int*)&len) = 100;

memset(mystr, 0, len); // molto bene, hai appena azzerato 50 byte di troppo perche' ti sei fidato della tua costante :)

Avatar utente
crisixk
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1402
Iscrizione: domenica 17 maggio 2009, 1:15
Località: Pontedera - Pisa
Contatti:

Re: [Ling C.] 'const' e ottimizzazione in fase di compilazione

Messaggio da crisixk »

ciao Ashura, grazie per le spiegazioni  :)
Lasciando perdere il fatto che e' abbastanza una porcheria utilizzare il C-cast per togliere il constness di una variabile,
dipende cosa si vuol fare ... in alcuni casi è una porcheria, in altri è un escamotage ... nel mio caso non ti spiego cosa sto facendo perchè andrei  (ot) e mi dilungherei troppo ...
Quando il compilatore trova una variabile 'const' non crea nessun 'blocco non modificabile' ( non esiste un concetto del genere ) ma piazza quella variabile nello stack. Si segna pero' nella sua virtual table che quella variabile e' una costante.
il punto è proprio quello, non sapendo(io) come viene tradotto il codice dal compilatore, mi è venuto il dubbio che, definendo una costante e poi andando a modificarla, potessi creare una falla nel sistema ...
Questo mio dubbio è nato rispetto al concetto di ottimizzazione in fase di compilazione, ossia quando il compilatore per render più veloce e "prestante" l'eseguibile, effettua una serie di accorgimenti se vengono utilizzati i flags -O, -O1, -O2, ecc.
In questi casi, magari .. ho pensato, il compilatore per ottimizzare, quando trova un valore const "crea una situazione" che migliora le prestazioni, ma porta a casini in caso non ci si attenga alla dichiarazione iniziale e si cambi il valore ...
Non so se mi sono spiegato ... mi leggo contorto da me  (rotfl)
Pero' il bug ce lo puoi mettere te... prendi questo esempio:

Codice: Seleziona tutto

const int len = 50;
char* mystr = (char*)malloc(len);

... codice ...

*((int*)&len) = 100;

memset(mystr, 0, len); // molto bene, hai appena azzerato 50 byte di troppo perche' ti sei fidato della tua costante :)
per fortuna ho già passato da un pò quella fase ....  :P
Avvolte cio' che si crea per facilitarci la vita, ci libera dal ragionare ed insieme ci imprigiona in una sorta di limbo nel quale la coscienza è solo un limite, uno spreco di risorse e tempo. Cosa fa' la mia mano ?
... s'impara un passo alla volta ...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti