Supposons la classe de jouets suivante, et les compilateurs modernes (gcc récent par exemple).C++ performance de la primitive de retour par valeur ou par référence (const)
template <typename T>
class SomeVec {
public:
...
virtual T get(const int index) = 0;
}
L'application implique une bonne quantité de nombre crissement en fonction des valeurs stockées dans les sous-classes SomeVec, T étant un type primitif, dire int
. Toutefois, la pratique stl containers
et boost::numeric::ublas::vector
consiste à renvoyer des valeurs stockées via (const) reference
.
Je me suis demandé quelles différences de performance cela impliquait. Dans this question, il est montré que l'accès aux éléments de tableau par la valeur et l'accès aux éléments vectoriels par référence résulte dans le même code, donc je suppose que le compilateur peut dans certains cas optimiser les choses.
Maintenant, mes questions sont les suivantes:
(1)
stl
etublas
sont basés sur des modèles, alors que ma solution nécessite des méthodes virtuelles. Est-ce que cela entrave la capacité des compilateurs modernes à optimiser le code?(2) Si le compilateur ne pouvait pas optimiser pour renvoyer la référence atomique const comme valeur, puis-je supposer que l'appel de la méthode virtuelle et le déréférencement coûtent approximativement le même? Ou est-ce que l'un est significativement plus cher que l'autre?
Merci!
Vous avez ici une méthode purement virtuelle, ce qui implique que vous avez des classes dérivées. Pouvez-vous donner un exemple? –
@Oli: Les sous-classes peuvent être diverses, mais par exemple une implémentation simple aurait un vecteur interne ou une carte et retournerait l'une des valeurs stockées. Bien sûr, cela implique beaucoup plus de frais généraux que le type de retour impose, mais ne considérons pas cela. – ron