J'ai toujours appris que les types non primitifs doivent être passés par référence const plutôt que par la valeur, si possible, à savoir:De petites structures simples devraient-elles être transmises par référence const?
void foo(std::string str);//bad
void foo(const std::string &str);//good
Mais je pensais aujourd'hui que peut-être en fait des types définis par l'utilisateur simples peuvent effectivement être mieux passé par valeur, par exemple:
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?
Ma pensée est que, en passant le Vector2 par référence, il est en fait plus cher que de passer par la valeur depuis le compilateur utilise maintenant un pointeur et déréférencement pour accéder à la const Vector2 & pos version?
Est-ce le cas? Les objets simples sont-ils les mieux réussis en valeur? Où la ligne devrait-elle être dessinée?
Notez que si votre type de classe a des constructeurs déclarés par l'utilisateur, ce n'est pas POD. –
La règle générale: Passer par const-référence, sauf si 'sizeof (T) <= sizeof (void *)' ou 'T' est primitif. – GManNickG
@GMan, tu m'as battu dessus (et +1). Bien, je généraliserais à c'est probablement inférieur ou égal au mot-taille du processeur. Et, il faut vérifier les spécifications du processeur pour trouver la taille optimale. Si je ne me trompe pas, les compilateurs pourraient potentiellement optimiser un ref const à une valeur de passe dans certains cas, indépendamment de la taille. J'imagine que ceci est particulièrement vrai en C++ 0x étant donné la nouvelle sémantique de déplacement. –