È del tutto possibile che Eigen sia solo una libreria terribilmente scritta (o solo mal concepita); solo perché qualcosa è online non lo rende vero. Ad esempio:
Passare gli oggetti in base al valore è quasi sempre una pessima idea in C++, poiché ciò significa copie inutili e si dovrebbe passarle invece per riferimento.
Questo non è un buon consiglio in generale, a seconda dell'oggetto. A volte è necessario pre-C++ 11 (perché si potrebbe desiderare che un oggetto sia non copiabile), ma in C++ 11, è mai mai necessario. Potresti ancora farlo, ma non è mai necessario per passare sempre un valore per riferimento. Puoi semplicemente spostarlo per valore se contiene memoria allocata o qualcosa del genere. Ovviamente, se si tratta di una sorta di "look-but-don -t-touch", const&
va bene.
Oggetti struct semplici, presumibilmente come quelli di Eigen Vector2d
sono probabilmente abbastanza economici da copiare (specialmente in x86-64, dove i puntatori sono a 64 bit) che la copia non significherà molto in termini di prestazioni. Allo stesso tempo, lo è l'overhead (in teoria), quindi se si è in un codice critico delle prestazioni, può essere d'aiuto.
Quindi, di nuovo, non può.
Il particolare problema di arresto anomalo di cui Eigen sembra parlare riguarda l'allineamento degli oggetti. Tuttavia, la maggior parte del supporto di allineamento specifico del compilatore C++ 03 garantisce l'allineamento in tutti i casi. Quindi non c'è motivo che dovrebbe "rendere il tuo programma in crash!". Non ho mai visto una libreria SSE/AltaVec/etc che utilizza dichiarazioni di allineamento specifiche del compilatore che hanno causato arresti anomali con i parametri di valore. E ne ho usati parecchi.
Quindi se stanno avendo qualche tipo di problema di crash con questo, allora considererei Eigen di ... un merito dubbio. Non senza ulteriori indagini.
Inoltre, se un oggetto non è sicuro da passare in base al valore, come suggerito dai documenti Eigen, il modo corretto per gestirlo sarebbe rendere l'oggetto non costruibile dalla copia. L'assegnazione delle copie andrebbe bene, poiché richiede un oggetto già esistente. Tuttavia, Eigen non lo fa, il che suggerisce ancora una volta che gli sviluppatori hanno perso alcuni dei punti migliori del design dell'API.
Tuttavia, per la cronologia, C++ 11 ha la parola chiave alignas
, che è un modo standard per dichiarare che un oggetto deve essere di un certo allineamento.
Inoltre, perché non c'è alcun problema nel restituire tali oggetti in base al valore?
Chi dice che non c'è (notando il problema di copia, non il problema di allineamento)? La differenza è che non è possibile restituire un valore temporaneo per riferimento. Quindi non lo fanno perché non è possibile.
Hai guardato ['std :: aligned_storage <>'] (http://en.cppreference.com/w/cpp/types/aligned_storage)? – ildjarn
Non ho mai sentito parlare di un oggetto che non può essere passato per valore e considererebbe mal progettato tale oggetto. Mi chiedo perché Eigen l'abbia fatto? –
@ildjarn: Ora ho :) Potresti spiegare come influenza il passaggio di un tipo in base al valore? –