L'efficacité du passage de std::vector

Quand une fonction C++ accepte un std::vector argument, le schéma habituel est de passer par const de référence, tels que:

int sum2(const std::vector<int> &v)
{
   int s = 0;
   for(size_t i = 0; i < v.size(); i++) s += fn(v[i]);
   return s;
}

Je crois que ce code entraîne une double référence lorsque les éléments du vecteur sont accessibles, parce que le PROCESSEUR doit d'abord déréférencement de v de lire le pointeur vers le premier élément, le pointeur doit être déréférencés de nouveau à lire le premier élément. Je m'attends à ce qu'il serait plus efficace de passer d'une copie de l'objet vectoriel sur la pile. Une telle copie superficielle résumerait un pointeur vers le premier élément, et la taille, avec le pointeur de la référence à la même zone de mémoire que le vecteur d'origine n'.

int sum2(vector_ref<int> v)
{
   int s = 0;
   for(size_t i = 0; i < v.size(); i++) s += fn(v[i]);
   return s;
}

Des performances similaires, mais beaucoup moins la commodité pourrait être obtenu par le passage d'un itérateur à accès aléatoire paire. Ma question est: quel est vicié par cette idée? J'attends qu'il devrait y avoir une bonne raison que les gens intelligents accepter de payer la performace coût de vecteur de référence, ou de traiter avec l'inconvénient d'itérateurs.

Edit: sur la Base de commentaires ci-dessous, veuillez tenir compte de la situation si je il suffit de renommer l'a suggéré vector_ref classe de tranche ou gamme. L'intention est d'utiliser random-access itérateur les couples avec plus de naturel de la syntaxe.

  • Avez-vous fait contre le code machine généré dans les deux cas? Ou mesuré les performances?
  • Avez-vous vérifié qu'il en est bien ainsi dans l'assemblée? Aussi, je ne pense pas que la convention de itérateur paires vient de considérations de performance, c'est la conception de décision (et en effet boost est en favorisant un beaucoup plus commode concept d'itérateur gamme d'objets, même si je n'ai pas étudié la façon dont ils agissent exactement).
  • Je ne pense pas que vos commentaires en fait aucun sens. Une référence est un alias vers un objet. En tant que tel, il n'est pas plus cher pour accéder à une référence à un objet en tant qu'il serait à accède à l'objet d'origine. Cette légèrement inflammatoire diatribe est de la spéculation de votre part, si vous aviez fait deux minutes de la diligence raisonnable, vous n'auriez pas besoin de ce post.
  • une référence est un pointeur avec la syntaxe du sucre sur elle. Sérieusement.
  • Une référence est un pointeur qui ne peut pas être réinstaller (point à un autre objet). Le compilateur peut être en mesure d'optimiser le code qui utilise une référence au lieu d'un pointeur de façon plus efficace en raison de cette propriété. Mais une référence est en effet tout à fait différent de l'objet lui-même.
InformationsquelleAutor shojtsy | 2009-11-20