2013-05-17 9 views
5

Nelle mie classi uso std::vector ecc. Come variabili membro, che vengono con i propri costruttori di movimento. Non dichiaro esplicitamente i costruttori di move per le mie classi e non sono dichiarati implicitamente per la maggior parte.Le variabili membro in oggetti temporanei vengono spostate implicitamente quando possibile?

Se il costruttore di copie implicite o l'operatore di assegnazione implicito della mia classe viene chiamato con un valore rvalue, i membri che hanno spostato i costruttori sono stati copiati o spostati?

Se vengono spostati, c'è qualche ragione per cercare di evitare i provvisori quando si usano classi con membri costruibili per lo spostamento?

+0

Se si utilizza C++ 11 verranno spostati, se C++ 03 verranno copiati. Da C++ 11 tutte le classi di contenitore di libreria standard trarranno vantaggio dalla semantica del movimento. –

+0

Ma questo non sarebbe il caso se dichiaro esplicitamente un costruttore di copia giusto? Per quanto ne so, l'associazione di un riferimento const a un valore rval e l'assegnazione dei contenuti non consentirebbe l'utilizzo degli operatori di assegnazione del movimento dei membri. – gokturk

+0

_ "non sono dichiarati implicitamente per la maggior parte." _ Allora il tuo tipo non ha la semantica del movimento, quindi non è possibile spostare i membri –

risposta

0

Il costruttore di copie ha una sola firma, implicitamente creata o dichiarata esplicitamente, quindi non è possibile per il compilatore generare codice diverso a seconda dell'operando di destra di tale costruttore. Lo ha per copiare gli attributi mobili in tutti i casi, perché il costruttore di copie ha solo un set di codice che deve funzionare per tutti gli input possibili.

Penso che la tua ultima domanda potrebbe essere legata alle prestazioni, ma non posso dirlo con certezza. Quello che vorrei suggerire è scrivere il codice più ovvio e lasciare che l'ottimizzatore abbia una crepa. Poi profili i risultati e vedi se mostra che la creazione e distruzione temporanee stanno causando problemi per te, e solo se lo sono, dovresti prendere in considerazione meccanismi alternativi.

4

Se la classe non dichiara esplicitamente un operatore di costruzione/assegnazione delle mosse e non vengono dichiarati implicitamente, allora la copia codificata/assegnatore-op implicitamente dichiarata non sposta i membri, ma li copia.

Sarebbero spostati se lo spostamento ctor/assegnazione-op fosse dichiarato implicitamente per la classe. Dici che non lo sono - perché è così? Le tue classi hanno distruttori personalizzati? Dovresti sforzarti per un progetto in cui non ti serve un supervisore personalizzato, copiare/spostare il ctor e copiare/spostare il compito di assegnazione - a volte chiamato "Regola dello zero".

Se è necessario un operatore personalizzato, è necessario dichiarare move ctor/assignment-op in modo esplicito per utilizzare semantica di spostamento. Se il tuo compilatore lo supporta, puoi dichiararli come predefiniti.

+0

"Se il compilatore lo supporta, puoi dichiararli come predefiniti. " Non è una cattiva idea nella maggior parte dei casi (regola del cinque)? – dyp

+0

"Dici che non lo sono - perché è così?" Sì, la maggior parte ha distruttori. – gokturk

+1

@DyP La classe in questione sembra avere codificatori di copia definiti implicitamente, quindi è già rotta o il dtor fa solo cose che non influenzano una mossa predefinita, come la registrazione di qualcosa. – Angew