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.
Ciò dipende dall'ottimizzatore, non è vero? – dmckee