2009-05-01 11 views
18

Ho visto alcuni metodi come questo:In che modo const dopo una funzione ottimizza il programma?

void SomeClass::someMethod() const; 

Cosa dichiarazione const fare, e come può aiutare a ottimizzare un programma?

Modifica

vedo che la prima parte di questa domanda è stato chiesto prima ... MA, ancora non risponde alla seconda parte: come sarebbe questa ottimizzare il programma?

+2

Perché pensi che potrebbe "ottimizzare" il programma? Questo non è il suo scopo. –

+0

Ho sempre sentito parlare di come dichiarare const per una variabile aiuterebbe l'ottimizzazione. Non vedo molto nel dichiarare const in questo modo se non per ottimizzare. – Unknown

+2

Questo è stato [chiesto prima.] (Http://stackoverflow.com/questions/751681/meaning-of-const-last-in-ac-method-declaration) –

risposta

19

Se il compilatore sa che i campi di un l'istanza di classe non viene modificata attraverso una chiamata di funzione membro const, non deve ricaricare alcun campo che potrebbe aver tenuto nei registri prima della chiamata alla funzione const.

Questo è in qualche modo riferito alle domande frequenti in C++ nello discussion on const_cast.

+0

+1 per indirizzare la parte di ottimizzazione con una spiegazione che ha senso. Ci sono documenti che dettagliano questo? – Unknown

+0

Inoltre, ho la sensazione che dal momento che l'accesso al campo è statico, il compilatore non dovrebbe sapere se è necessario ricaricare un campo in un registro o no? – Unknown

+0

Ho aggiunto un collegamento. Cosa intendi per "l'accesso al campo è statico"? –

1

Impedisce a someMethod di modificare qualsiasi variabile membro di un oggetto di quella classe.

+3

... qualsiasi variabile membro non mutabile .. –

+0

...o qualsiasi metodo che non farà un cast in stile const/c su questo ... :) – RnR

5

Indica al compilatore che il metodo non ha alcun effetto sullo stato delle classi; non puoi assegnare nulla in esso. Dai uno sguardo allo C++ FAQ Lite 18.10.

2

Esso consente di chiamare la funzione di membro della classe sul const oggetti:

class SomeClass 
{ 
public: 
    void foo(); 
    void bar() const; 
} 

SomeClass a; 
const SomeClass b; 

a.foo(); // ok 
a.bar(); // ok 
b.foo(); // ERROR -- foo() is not const 
b.bar(); // ok -- bar() is const 

C'è anche la qualificazione volatile per l'uso con volatile oggetti, e si può anche fare le funzioni const volatile per l'uso su const volatile oggetti, ma quelli due sono estremamente rari.

0

Il mio primo pensiero per quanto riguarda l'ottimizzazione è che dal momento che 'const' indica che lo stato dell'istanza non è cambiato, il compilatore può avere più libertà rispetto al riordinamento delle chiamate vicine ai metodi su quell'istanza.

+0

Il compilatore non lo farà. const ti impedisce di modificare l'oggetto ma la funzione può modificare altre cose, incluso il target di puntatori nell'oggetto. –

+0

Grazie. Sapevo che la funzione 'const' poteva ovviamente cambiare lo stato interno mutevole, ma non ero sicuro se questo necessariamente escludesse di essere in grado di fare questo livello di ottimizzazione poiché dal punto di vista dei chiamanti l'oggetto è concettualmente immutato. – imaginaryboy

+0

Nick in realtà significa che i puntatori all'interno di un oggetto non possono essere modificati, ma ciò che indicano * può * essere modificato anche all'interno di una funzione membro const. Quanto segue è possibile: class {public: int * x; void blah() const {* x = 42; // ma "x = 0xblahblah;" sarebbe illegale qui}}; –

4

Il codice asm generato per il metodo const sarà lo stesso se il const è presente oppure no. const è una funzione del compilatore, non del runtime, quindi se ci sono dei guadagni in termini di prestazioni, penserei che il compilatore di ottimizzatori possa usare il const come suggerimento per cose come l'inlining o la determinazione degli effetti collaterali per una possibile ottimizzazione. Quindi, in breve, l'ottimizzatore potrebbe essere in grado di aiutare un po ', ma se il metodo è semplice per iniziare, dubito che il codice generato dall'ottimizzatore sia qualsiasi const const o no.

Ecco un'ottimizzazione semplice che uso (piuttosto che perdere e perdere cose come const) che richiedono un secondo ma danno i frutti. Organizza le tue variabili di classe in modo che cadano sui limiti della linea di cache un po 'meglio e metti insieme le tue variabili più accessibili. Per farlo basta mettere i vostri interi, doppie, galleggianti, ecc insieme alla parte superiore delle vostre dichiarazioni di classi variabile e le variabili dimensioni dispari in fondo in questo modo:

int foo; 
int bar; 
double baz; 
SomeObject obj; 
char ch[14]; 
+0

+1 per indirizzare l'ottimizzazione, sebbene sia un po 'vaga. Ho avuto le stesse sensazioni che il codice generato sarebbe molto simile. – Unknown

Problemi correlati