membre" plus rapide / plus lent que l'appel implicite à "membre" - Retrouvez les réponses et les commentaires concernant cette question" />
10
votes

Accède à une classe membre C ++ via "this-> membre" plus rapide / plus lent que l'appel implicite à "membre"

Après une recherche sur notre ami Google, je n'ai pas pu obtenir une vue claire sur le point suivant.

Je suis utilisé pour appeler des membres de la classe avec ceci -> . Même si ce n'est pas nécessaire, je le trouve plus explicite car il aide à maintenir un algorithme lourde avec des charges de vars.

Comme je travaille sur un algorithme supposé optimisé, je me demandais si l'utilisation de ceci -> modifierait les performances d'exécution ou non.

Est-ce?


1 commentaires

Juste un indice: vous pouvez vérifier l'assemblage généré pour voir cela;)


4 Réponses :


14
votes

Non, l'appel est exactement le même dans les deux cas.


0 commentaires

10
votes

Cela ne fait aucune différence. Voici une démonstration avec GCC. La source est une classe simple, mais j'ai limité ce post à la différence de clarté.

% diff -s with-this.cpp without-this.cpp
7c7
<         this->x = 5;
---
>         x = 5;

% g++ -c with-this.cpp without-this.cpp  

% diff -s with-this.o without-this.o   
Files with-this.o and without-this.o are identical


2 commentaires

Je faisais le même test avec g ++. :) ça marche la même chose. Tout identique.


@Moustik: Il y a votre réponse, alors :-)



4
votes

Réponse a été donnée par Zennehoy et voici le code de montage (généré par Microsoft C ++ Compiler) pour une classe de test simple: XXX

La fenêtre de démontage dans Visual Studio montre que le code de montage est le même pour Les deux fonctions: xxx

et le code dans la principale: xxx

microsoft compilateur utilise __ thiscall Convention appelante Par défaut pour les appels de membre de la classe et Ce pointeur est passé via un registre ECX.


0 commentaires

2
votes

Il y a plusieurs couches impliquées dans la compilation d'une langue.

La différence entre accéder à membre comme membre , , this-> membre , myClass :: membre etc. .. est une différence syntaxique.

Plus précisément, c'est une question de recherche de nom et comment l'avant du compilateur "trouver" "trouver" l'élément exact que vous parlez. Par conséquent, vous pourriez accélérer la compilation en étant plus précis ... bien qu'il soit imperceptible (il y a beaucoup plus de tâches de consommation de temps en C ++, comme l'ouverture de toutes ces inclut).

Depuis (dans ce cas), vous vous référez au même élément, il devrait peu importe.


Maintenant, un parallèle intéressant peut être fait avec des langues interprétées. Dans une langue interprétée, la recherche de nom sera retardée au moment où la ligne (ou la fonction) est appelée. Par conséquent, cela pourrait avoir un impact au moment de l'exécution (mais encore une fois, probablement pas vraiment perceptible).


0 commentaires