2010-10-09 14 views
7

Eventuali duplicati:
Constants and compiler optimization in C++Does const aiuta l'ottimizzatore? C++

Vediamo le guerre sante cominciano: Ho sentito una serie di opinioni diverse sulla utilità di const in C++. Ovviamente ha usi nelle dichiarazioni delle funzioni dei membri, ecc. Ma quanto è utile come modificatore delle variabili (o piuttosto delle costanti)? Aiuta davvero l'ottimizzatore, se il resto del codice viene lasciato lo stesso?

+0

Ciò dipende dall'ottimizzatore, non è vero? – dmckee

risposta

4

const non aiuta l'ottimizzatore.

Da const può essere gettato via con const_cast, è possibile scrivere programmi che utilizzano const in diversi luoghi, poi gettato via e modificare variabili comunque, con comportamento definito secondo lo standard. Il compilatore deve quindi esaminare il codice effettivo del programma per determinare quali variabili vengono modificate quando, ed è probabilmente abbastanza buono in questo comunque (per esempio potrebbe determinare una variabile non const è invariabile su un determinato blocco di codice e ottimizzare di conseguenza).

Se il compilatore ha trattato ciecamente const come garanzia che qualcosa non cambierà, l'ottimizzatore interromperà alcuni programmi ben formati.

const è una funzionalità in fase di compilazione per aiutare i programmatori a scrivere codice corretto, aggiungendo alcuni vincoli in fase di compilazione e indicando un contratto di codice (ad esempio "Prometto di non modificare questo parametro"). Non ha nulla a che fare con l'ottimizzazione. Mentre gli invarianti sono importanti per gli ottimizzatori, questo non ha nulla a che fare con la parola chiave const.

C'è un'eccezione: oggetti dichiarati con const. Questi non possono essere modificati; anche se sono tramite casting, il comportamento non è definito. C'è un po 'di sottigliezza qui:

const int ci = 5; 
const_cast<int&>(ci) = 5; // undefined behavior, original object declared const 

int i = 5; 
const int& ci2 = i;  // cannot modify i through ci2, const reference 
const_cast<int&>(ci2) = 5; // OK, original object not declared const 

Così, quando il compilatore vede const int ci probabilmente fa assumere non potrà mai, mai cambiare, perché la modifica è un comportamento indefinito. Tuttavia, è probabile che questo non sia il collo di bottiglia del tuo programma, è solo un più sofisticato #define. A parte questo, lo const è debole: solo una parola chiave per il sistema di tipi.

+1

Si noti che la trasmissione della costanza su un oggetto che è inerentemente const è un comportamento non definito. –

0

Non può fare male e in teoria potrebbe consentire alcune ottimizzazioni, quindi si potrebbe anche usarlo - non so se fanno compilatori di produzione.

5

In generale, no, non aiuterà il compilatore. Poiché la costanza può essere castata in un secondo in C e C++, sarebbe difficile per il compilatore fare le ipotesi necessarie sui requisiti di codice soddisfatti per le ottimizzazioni.

Detto questo, la correttezza deve essere sempre utilizzata per gli altri vantaggi.

+0

Beh sì, può essere gettato via, ma se lo fai dietro ai compilatori, questo porterà a un comportamento indefinito. Se usi il cast normale, il compilatore conosce il punto esatto da cui deve rilasciare la costanza. –

17

Ci sono molti casi in cui il modificatore const non aiuta l'ottimizzatore, per il semplice fatto che il compilatore può già dire se hai modificato una variabile o meno. Il più grande vantaggio di const, secondo me, è che dice al compilatore se il programmatore intende modificare, che è utile nel trovare determinati tipi di errori semantici in fase di compilazione invece che in fase di esecuzione. Qualsiasi errore che puoi trasferire per compilare il tempo è un enorme vantaggio nella produttività del programmatore.

+1

Direi che questo è un po 'esagerato. Per cose banali, sì, una volta che vai oltre il limite della chiamata, vabbè ... Comunque è molto bello pensare a un modificatore di costanza mancante come un errore semantico che deve essere corretto. –