2014-11-16 16 views
6

Ho paio di domande su Eigen:Spostare la semantica in Eigen

  1. Qualcuno sa se c'è qualche piano per sostenere la semantica spostare in Eigen in qualunque momento presto? Impossibile trovare nulla nell'elenco TODO della pagina Web Eigen3. In questo momento sto usando la swap trucco per sbarazzarsi di provvisori, come

    MatrixXd foo() 
    { 
        MatrixXd huge_matrix(N,N); // size N x N where N is quite large 
        // do something here with huge_matrix 
        return huge_matrix; 
    } 
    
    MatrixXd A(N, N); 
    A.swap(foo()); 
    

    Mi piacerebbe molto scrivere quanto sopra swap linea in stile C++ 11 come

    A = foo(); 
    

    e non doversi preoccupare del temporaneo restituito da foo().

  2. Un compilatore C++ 98/C++ 03 può ottimizzare il codice A = foo(); per eliminare temporaneamente questo codice? O la scommessa più sicura è usare swap()?

risposta

5

Copy elision farà il lavoro bene. Anche un compilatore C++ 03 elide il temporaneo.
In particolare, NRVO (valore di ottimizzazione del ritorno di nome) sarà, per questo codice,

MatrixXd foo() 
{ 
    MatrixXd huge_matrix(N,N); 
    return huge_matrix; 
} 

MatrixXd A = foo(); 

costrutto huge_matrix proprio all'interno A. I C++ 03 previsto dalla norma in [class.copy]/15:

Questa elisione delle operazioni di copia è consentito nei seguenti circostanze (che possono essere combinati per eliminare più copie):

  • in un'istruzione return in una funzione con un tipo restituito classe, quando l'espressione è il nome di un oggetto automatico non volatile con lo stesso tipo cv-non qualificato come tipo di risposta della funzione, l'operazione di copia può essere omessa da costruire l'oggetto automatico direttamente in t Il valore restituito dalla funzione
  • quando un oggetto di classe temporaneo che non è stato associato a un riferimento (12.2) verrebbe copiato in un oggetto di classe con lo stesso tipo non compensato cv, l'operazione di copia può essere omessa costruendo il temporaneo oggetto direttamente nella destinazione della copia omessa
+0

Grazie, non ero sicuro di questo. In particolare, il mio 'foo' prende' A' come parametro di riferimento const, quindi in pratica ho qualcosa come 'A = foo (A)'. Copia elision dovrebbe funzionare anche in questo caso, poiché la regola as-if è soddisfatta, è corretto? – vsoftco

+0

Nel mio frammento di codice, sembra che la copia elision sia effettivamente eseguita dal copione, in una riga come 'MatrixXd A = foo()'. Tuttavia, NON viene eseguito dall'operatore di assegnazione, ogni volta che riuso 'A' come' A = foo(); ', e passo per valore all'operatore di assegnazione. – vsoftco

+0

Ohh Capisco perché, perché stavo usando un 'cout' nell'operatore di assegnazione, e questo ha un effetto osservabile, quindi non è elidato (anche se i copy ctors sono) http://stackoverflow.com/a/18610251/3093378 – vsoftco