2010-10-17 2 views
1

Pour les objets ou les données primitives avec une taille égale ou inférieure à la taille d'un pointeur la méthode de passage la plus efficace à une fonction serait certainement en valeur, mais je voudrais savoir s'il existe un outil capable de déterminer la meilleure méthode de passer des objets de classes ou des données primitives avec des tailles plus grandes que la taille d'un pointeur sur des fonctions sur une plate-forme, comme quelque chose d'outils de boost?Un outil pour déterminer le moyen le plus efficace de transmettre des données, par référence ou par valeur?

+0

Un profileur ou microprocesseur? – Necrolis

+0

@ Necrolis_Comment être capable de faire le travail? – Pooria

Répondre

4

Oui, cet outil est le compilateur. Passer par référence et si l'optimiseur remarque qu'il peut s'en tirer en stockant une copie de l'objet au lieu de l'adresse pour les objets dont la taille est inférieure ou égale à celle d'une adresse, alors il peut le faire. C'est probablement la meilleure approche pour le code basé sur un modèle, où vous ne pouvez pas être sûr que vos paramètres sont grands ou petits objets - utilisez simplement des références de toute façon.

Le compilateur n'est pas garanti ou requis pour effectuer cette optimisation, mais si ce n'est pas le cas, il s'agit probablement d'un problème de performance négligeable, il n'y a donc pas lieu de s'inquiéter.

+0

Il peut aussi fonctionner dans l'autre sens: Si vous passez par valeur, le compilateur peut également être en mesure d'effectuer l'élision de la copie, en éliminant la copie. Donc de toute façon, le compilateur va essayer de faire aller votre code rapidement. :) – jalf

+1

Bon point, ne s'en est pas rendu compte - mais le coût de l'optimisation qui ne se produit pas est plus élevé. Si un objet très volumineux est passé en valeur, il peut y avoir un gros problème de performance, mais si un petit objet est passé par référence, ce n'est probablement rien. Donc, je préférerais passer par référence de toute façon. – AshleysBrain

+0

Il y a quelques scénarios où vous voudrez certainement passer par la valeur: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ –

6

Oui, Boost a cela, appelé call traits. Mais son coût élevé en illisibilité est plus élevé que le gain microscopique en efficacité. À mon humble avis.

Vive & HTH.,

+0

Merci pour le lien. Maintenant, je sais ce que "meilleure méthode" signifie :-). –

5

Sauf si vous êtes dans une section critique, il est peu probable que astronomiquement pointeur déréférencement est le goulot d'étranglement de votre application, et si vous êtes à la section critique, vous feriez mieux de regarder cache amical algorithmes, de sorte que vous n'aurez pas besoin de payer le coût de la déréférencement de beaucoup. En bref, passez tout ce qui est plus grand que la taille du pointeur par référence/pointeur, et ne vous préoccupez que des performances lorsque vous savez que vous devez vous en soucier. L'optimisation prématurée est la racine de tout Mal.

+0

+1 pour "L'optimisation prématurée est la racine de tous les maux". – JoshD

+0

"L'optimisation prématurée est la racine de tous les maux." C'est pourquoi j'ai commencé ce fil! ;) – Pooria

Questions connexes