È necessario comprendere il motivo, per evitare la "programmazione settoriale del carico". Contrassegnare le stringhe come const fa una differenza di prestazioni perché non è più necessario utilizzare un incremento interlocked e decrementare il refcount sulla stringa, un'operazione che diventa effettivamente più costosa, non meno, con il passare del tempo perché più core significa più lavoro che deve essere fatto per mantenere sincronizzate le operazioni atomiche. Questo è sicuro da fare poiché il compilatore impone il vincolo "questa variabile non verrà modificata".
Per gli ordinali, che di solito sono 4 byte o meno, non si ottiene alcun guadagno in termini di prestazioni. L'utilizzo di const come ottimizzazione funziona solo quando si utilizzano tipi di valore superiori a 4 byte, ad esempio matrici o record o tipi conteggiati di riferimento come stringhe e interfacce.
Tuttavia, c'è un altro importante vantaggio: la leggibilità del codice. Se passi qualcosa come const e non fa alcuna differenza per il compilatore, può ancora fare la differenza per tu, dal momento che puoi leggere il codice e vedere che l'intenzione era di farlo non essere modificato. Questo può essere significativo se non hai visto il codice prima (qualcuno l'ha scritto) o se torni indietro dopo molto tempo e non ricordi esattamente cosa stavi pensando quando lo hai scritto originariamente.
fonte
2009-10-21 14:18:38
+1 sicuramente una spiegazione più soddisfacente della mia stessa – jpfollenius
Il tuo primo paragrafo è sbagliato per quanto riguarda le stringhe. Le stringhe vengono sempre passate come rappresentazione del puntatore a quattro byte. 'Const' sopprime il codice nel prologo ed epilogo della funzione che aggiorna il conteggio dei riferimenti della stringa. Lo stesso vale per i parametri di interfaccia e gli array dinamici. Allo stesso modo, i record vengono passati come puntatori. 'Const' semplicemente sopprime il codice del prologo che copia il record nello stack locale della funzione. In altre parole, 'const' ha * nessun effetto * sul lato * caller * di una funzione. Influisce solo sul destinatario della chiamata. –
@Rob: Bummer che i commenti non possono essere modificati. È facile interpretare erroneamente il tuo commento come se dicessi che i record vengono sempre passati come puntatori. –