Question

Lorsqu'une fonction qui prend un pointeur en argument est insérée, le compilateur supprime-t-il l'indirection pendant le processus d'optimisation?Bien sûr, quand cela a du sens ..

Voici un exemple évident:

inline void say_hello (person* p) {
    std::cout << "hello " << p->name << std::endl;
}

int main () {
    person goldorak;
    goldorak.name = "Goldorak";

    say_hello(&goldorak);
    return 0;
}

Ce cas est trivial, mais si le compilateur fait l'optimisation, y a-t-il des cas où ce n'est pas le cas?

Bonus : où puis-je obtenir une liste de quelques optimisations "de base" effectuées par mon compilateur?

Ps: je suis juste curieux

Était-ce utile?

La solution

Je suppose GCC, et donc le lien que vous recherchez est http://gcc.gnu.org/onlinedocs / gcc / Optimize-Options.html

Et pour citer: (ce n'est peut-être pas ce que vous vouliez)

-findirect-inlining Appels indirects en ligne également connus pour être connus à temps de compilation grâce à l'inlining précédent.Cette option a un effet uniquement lorsque l'inlining lui-même est activé par les fonctions -finline ou options -finline-small-functions.

Enabled at level -O2.

La documentation équivalente pour les compilateurs Visual Studio (y compris C ++) http://msdn.microsoft.com/en-us/library/k1ack8f1.aspx (vous pouvez suivre les liens pour plus d'informations)

Autres conseils

Un bon compilateur ferait cela.Ce serait cependant un processus en deux étapes.Tout d'abord, cela intégrerait la fonction.Une phase ultérieure pourrait alors réaliser que la seule utilisation de la structure est de conserver temporairement name et de l'éliminer.

Oui, d'après mon expérience, cela est vrai à la fois pour les pointeurs (C et C ++) et les références (C ++ uniquement bien sûr) - à peu près tout compilateur décent optimisera l'indirection redondante.Même Visual Studio le fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top