Sono sempre stato insegnato che i tipi non primitivi dovrebbero essere passati per riferimento const piuttosto che per valore, se possibile, vale a dire:Le piccole strutture semplici devono essere passate per riferimento const?
void foo(std::string str);//bad
void foo(const std::string &str);//good
Ma stavo pensando oggi che forse in realtà alcuni semplici tipi definiti dall'utente possono realmente essere meglio passati per valore es:
class Vector2
{
public:
float x, y;
...constructors, operators overloads, utility methods, etc...
};
void foo(Vector2 pos);
void foo(const Vector2 &pos);//is this really better than by value?
void foo(float x, float y);//after all isn't by value effectively doing this?
mio pensiero è che facendo passare il Vector2 per riferimento, è in realtà più costoso di passaggio per valore dal compilatore sta utilizzando un puntatore e dereferencing per accedere alla const Vector2 & pos versione?
È questo il caso? Gli oggetti semplici sono meglio passati per valore? Dove dovrebbe essere tracciata la linea?
Si noti che se il proprio tipo di classe ha costruttori dichiarati dall'utente, non è POD. –
La regola generale: passare per riferimento costante, a meno che 'sizeof (T) <= sizeof (void *)' o 'T' sia primitivo. – GManNickG
@GMan, mi hai battuto (e +1). Anche se, generalizzerei è probabilmente inferiore o uguale alla dimensione della parola del processore. E, uno dovrebbe controllare le specifiche del processore per scoprire la dimensione ottimale. Se non sbaglio, i compilatori potrebbero potenzialmente ottimizzare un const-ref ad un passaggio per valore in alcuni casi, indipendentemente dalle dimensioni. Immagino che questo sia particolarmente vero in C++ 0x data la nuova semantica del movimento. –