Domanda

I magari chiedendo una domanda stupida, ma ho guardato la pagina di wikipedia per RVO qui e non riusciva a smettere di chiedersi se tale comportamento è sbagliato. Ho provato nella mia macchina e RVO è completamente preso a calci a dispetto livello di ottimizzazione. E se ci fosse davvero qualcosa di BIG happenning in un costruttore? So che non dovrebbe, ma cosa succede se? Non riesco a capire il motivo per cui RVO sarebbe ancora accadere quando ci sono effetti collaterali nel costruttore.

EDIT: -fno-elide-constructors sembra fermarsi RVO. Ma la domanda rimane.

EDIT2: Su una nota più grave, quante persone conoscono qualcosa di simile? E 'forse nello standard, ma è ancora una caratteristica davvero brutta come la vedo io. Almeno compilatori dovrebbero disabilitare di default e di fornire un interruttore per persone che conoscono questo. :)

EDIT 3: ho ancora insistere che questo è davvero male. :). Non credo che io so di qualsiasi altro vincolo linguaggio come questo che va direttamente contro la sintassi del linguaggio. Tutto il resto getta sia errori di compilazione o di linker giusto?

È stato utile?

Soluzione

I mandati standard che le operazioni con la preoccupazione di un programma Stato osservabile non deve essere ottimizzato via, ad eccezione di copia costruzione in determinate circostanze. Non si deve fare affidamento su costruttori di copia da eseguire, anche se hanno effetti collaterali che ci si aspetta di vedere (per esempio, l'output della console).

Altri suggerimenti

Come detto in altre risposte, il compilatore è consentito ottimizzare via anche non banale costruttori di copia e operatori di assegnazione.

  

12.8.15

     

Quando vengono soddisfatti determinati criteri, un'implementazione è consentito omettere la copia costruzione di un oggetto classe, anche se   il costruttore di copia e / o distruttore per l'oggetto hanno effetti collaterali . In tali casi, l'applicazione tratta la   origine e destinazione dell'operazione di copia omessa in quanto semplicemente due diversi modi di riferirsi allo stesso oggetto, e   distruzione di tale oggetto avviene a seguito dei tempi in cui i due oggetti sarebbero stati distrutti senza   ottimizzazione. Questa elisione operazioni di copia è consentito nei seguenti casi (che possono essere combinati   per eliminare le copie multiple):

     

- in una dichiarazione di ritorno in funzione con un tipo di classe di ritorno, quando l'espressione è il nome di un non-volatile   automatico di oggetti con lo stesso tipo cv-qualificato come tipo di funzione di ritorno, l'operazione di copia può essere omessa   costruendo l'oggetto automatica direttamente nel valore di ritorno della funzione

     

- quando un oggetto di classe temporanea che non è stato legato a un riferimento (12.2) sarebbe stato copiato in un oggetto di classe con   lo stesso tipo cv-qualificato, l'operazione di copia può essere omessa costruendo l'oggetto temporaneo direttamente   l'obiettivo della copia omesso

Definisci "sbagliato". Il linguaggio C ++ consente esplicitamente questo tipo di ottimizzazione anche se è osservabile. Se il comportamento del programma dipende da una specifica implementazione, poi purtroppo non si sta utilizzando ISO C ++, ma alcuni dialetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top