2010-10-05 9 views
6

Capisco il comportamento dei tipi di dati qualificati const. Tuttavia, sono curioso di sapere se c'è un guadagno o una perdita di prestazioni da eccessiva o insufficiente zelantezza delle variabili qualificanti come const. Penso in particolare alle variabili dichiarate e utilizzate esclusivamente all'interno di un blocco di codice isolato. Ad esempio, qualcosa come:La dichiarazione delle variabili C++ aiuta o danneggia le prestazioni?

const qreal padding = CalculatePadding(); 
const QSizeF page_size = CalculatePagePreviewSize(padding); 
const QRectF content_rect = CalculatePagePreviewContentRect(page_size); 
const QList<QRectF> pages = renderer.BuildPrintPages(printer_, map_scene_); 
const QFont page_number_font = CalculatePageNumberFont(); 
const QFontMetrics metrics(page_number_font); 

Supponiamo che ho solo bisogno const metodi Qualificato su tutti questi C'è qualche guadagno di prestazioni nel dichiarare tutti const (e altro ancora.)? Oppure, al contrario, questo danneggia le prestazioni?

Sono curioso sia per le prestazioni in fase di esecuzione (sto indovinando questo non fa alcuna differenza come il const è esclusivamente un controllo in fase di compilazione - qualcuno può confermare?) E compilare in tempo le prestazioni. Non ho abbastanza esperienza con C++ per avere un'idea di questo, e mi chiedo se dovrei sbagliare sul lato di sotto-o sotto-applicazione const quando tutte le altre cose (manutenibilità, ecc.) Sono uguali.

+1

nella maggior parte dei casi, nessuna differenza di prestazioni in fase di esecuzione – Anycorn

+2

dupe? http://stackoverflow.com/questions/3435026/can-const-correctness-improve-performance – Anycorn

+0

Qt è molto copy-on-write quindi sospetto che const possa avere un effetto reale qui. –

risposta

20

const è principalmente una cosa in fase di compilazione, tuttavia, dichiarare qualcosa come const talvolta consente determinate ottimizzazioni. Se il codice in questione non è un collo di bottiglia delle prestazioni, non mi preoccuperei di questo e basta usare const come previsto: per produrre codice più chiaro e impedire a te stesso di fare cose stupide.

2

La mia comprensione è che const può essere utilizzato dal compilatore per ottimizzare potenzialmente le prestazioni, ma non ne è la garanzia; non ci dovrebbe essere un lato negativo delle prestazioni, però. Potrebbe potenzialmente influire sul comportamento in fase di esecuzione (ad esempio: il compilatore potrebbe inserire variabili const su pagine di memoria di sola lettura).

Non dovrebbe avere un impatto significativo sulle prestazioni, ma mi piacerebbe utilizzarlo di più per semplificare la manutenzione del codice. Solo la mia opinione, però.

1

Mentre la risposta è tecnicamente "sì", la risposta pratica è NO. È vero che il compilatore può, in determinate circostanze, eseguire ottimizzazioni del codice tenendo conto che un dato valore non può cambiare o che un metodo non modificherà l'oggetto proprietario. Tuttavia, si tratterà di casi situazionali e così incredibilmente in fondo alle erbacce dell'ottimizzazione che sarebbe quasi certamente un errore prenderlo in considerazione in anticipo.

0

const è solo lì per aiutarti a catturare errori in fase di compilazione. Tuttavia dal momento che questa cosa si chiama const_cast puoi sempre modificare la costanza di qualsiasi variabile, in modo che il compilatore non possa davvero fare a meno di ottimizzare qualsiasi cosa. (Puoi anche divertirti con i cast di c-style per eliminare costanze che potrebbero invalidare le ottimizzazioni.)

+1

evitare 'const_cast' sempre e usarlo solo quando non hai scelta (es: stai lavorando con una libreria esterna non puoi cambiare l'interfaccia, ma sapere che la modifica di un oggetto const è" abbastanza sicuro ") . – rubenvb

+2

Questo non è proprio vero. Se hai definito una variabile come const, non puoi scriverla * e * scrivere su di essa. Un compilatore che memorizza nella cache un valore variabile basato sul fatto che la variabile è const va bene. Qualsiasi programma che scrive su una variabile const ha un comportamento indefinito. –

+0

Johannes - primo risultato di una ricerca google su const e ottimizzazione: http://www.gotw.ca/gotw/081.htm - provalo tu stesso, puoi scrivere su una variabile non certificata – miked

2

Nella mia (limitata) esperienza, const può danneggiare le prestazioni di un bel po '(sorpresa!) Vale a dire, quando si lavora con le classi di container si deve fare attenzione a ciò che contine fa: per gli array potrebbe semplicemente forzare il compilatore a creare una copia del contenitore (ad es. un array) quando si accede a un singolo elemento solo per leggere ... Questo era un enorme dolore per individuare il codice su cui sto lavorando.

Problemi correlati