2014-07-03 14 views
7

Desidero inizializzare alcuni dati statici sul thread principale.È possibile ottimizzare le funzioni se presentano effetti collaterali?

int32_t GetFoo(ptime t) 
{ 
    static HugeBarData data; 
    return data.Baz(t); 
} 

int main() 
{ 
    GetFoo(); // Avoid data race on static field. 
       // But will it be optimized away as unnecessary? 

    // Spawn threads. Call 'GetFoo' on the threads. 
} 

Se il compilatore può decidere di rimuoverlo, come posso costringerlo a rimanere lì?

+0

Sono cautamente ottimista sul fatto che le persone che scrivono compilatori siano abbastanza intelligenti da non gettare invocazioni di funzioni che hanno effetti collaterali, solo perché si scarta il loro valore di ritorno. – meagar

+0

Preferirei piuttosto una sezione pertinente dello standard. – Sam

+1

Se il tuo scopo è quello di evitare le condizioni di gara (come dice il commento del codice sorgente), non hai bisogno della chiamata iniziale. C++ 11 non garantisce condizioni di competizione per l'inizializzazione delle variabili statiche locali (le precedenti versioni dello standard non rispondevano ai thread). – Eugene

risposta

4

compilatori devono ottimizzare secondo la regola "come-se". Cioè, dopo ogni ottimizzazione, il programma deve ancora comportarsi (nel senso logico) come se il codice non fosse ottimizzato.

Se sono presenti effetti collaterali a una funzione, qualsiasi ottimizzazione deve preservare gli effetti collaterali. Tuttavia, se il compilatore può determinare che il risultato degli effetti collaterali non influisce sul resto del programma, può ottimizzare anche gli effetti collaterali. I compilatori sono molto prudenti su questa area. Se il compilatore ottimizza gli effetti collaterali del costruttore HugeBarData o della chiamata Baz, che sono richiesti altrove nel programma, questo è un bug nel compilatore.

Ci sono alcune eccezioni in cui il compilatore può effettuare ottimizzazioni che alterano il comportamento del programma dal caso non ottimizzato, di solito con le copie. Non penso che nessuna di queste eccezioni si applichi qui.

Problemi correlati