46 votes

Pourquoi ne pas tout marquer en ligne?

Tout d'abord, je suis pas à la recherche d'un moyen de forcer le compilateur associé à la mise en œuvre de chaque fonction.

Pour réduire le niveau de réponses erronées assurez-vous de comprendre ce que l' inline mot-clé signifie réellement. Voici une bonne description, inline vs statique vs extern.

Donc ma question, pourquoi ne pas marquer chaque définition de fonction inline? ie Idéalement, la seule unité de compilation serait main.cpp. Ou peut-être un peu plus pour les fonctions qui ne peuvent pas être définies dans un fichier d'en-tête (pimpl idiome, etc).

La théorie derrière cette demande étrange est qu'il donnerait l'optimiseur maximum d'informations pour travailler avec. Il pourrait fonction inline, les implémentations bien sûr, mais il pourrait aussi faire de la "croix-module d'optimisation", comme il n'y a qu'un seul module. Existe-il d'autres avantages?

Est-ce quelqu'un a essayé avec une application réelle? A l'augmentation de la performance? diminuer?!?

Quels sont les inconvénients de marquage de toutes les définitions de fonction inline?

  • La Compilation peut être plus lent et consomme beaucoup plus de mémoire.
  • Itératif versions sont cassés, l'ensemble de l'application a besoin d'être reconstruit après chaque modification.
  • Temps de liaison pourrait être astronomique

L'ensemble de ces inconvénient d'effet que le développeur. Quels sont le moteur d'exécution des inconvénients?

24voto

Ben Voigt Points 151460

Voulez-vous vraiment dire #include tout? Cela vous donnerait un seul module et laisserait l’optimiseur voir l’ensemble du programme en une fois.

En réalité, Visual C ++ de Microsoft fait exactement cela lorsque vous utilisez le commutateur /GL (optimisation de programme complet) . En fait, il ne compile rien tant que l'éditeur de lien n'a pas été exécuté et n'a accès à tout le code. D'autres compilateurs ont des options similaires.

15voto

pm100 Points 8303

sqlite utilise cette idée. Pendant le développement, il utilise une structure source traditionnelle. Mais pour une utilisation réelle, il existe un énorme fichier c (112 000 lignes). Ils le font pour une optimisation maximale. Réclamer une amélioration des performances d'environ 5 à 10%

http://www.sqlite.org/amalgamation.html

9voto

Crashworks Points 22920

Nous (et quelques autres entreprises de jeu) n'essayez via la fabrication d'un uber-.CPP qu' #includeed tous les autres, c'est une technique connue. Dans notre cas, il n'a pas semblé affecter runtime beaucoup, mais le moment de la compilation des inconvénients que vous mentionnez s'est avéré être tout à fait rédhibitoire. Avec une demi-heure de la compilation après chaque changement, il devient impossible pour l'itération de manière efficace. (Et c'est avec l'app classés dans plus d'une douzaine de différentes bibliothèques.)

Nous avons essayé de faire une configuration différente telle que nous n'en aurait plusieurs .objs pendant le débogage et alors l'uber-RPC seulement dans la version opt construit, mais a couru dans le problème de l'compilateur simplement à court de mémoire. Pour une assez grande application, les outils ne sont tout simplement pas à la compilation d'une entreprise de plusieurs millions de ligne de fichier cpp.

Nous avons essayé LTCG en tant que bien, et qui ont fourni une petite mais agréable exécution de stimuler, dans les rares cas où il ne s'est pas contenté d'incident au cours de la phase d'édition de liens.

8voto

e.James Points 51680

Question intéressante! Vous êtes certainement le droit que toute la liste des inconvénients spécifiques pour le développeur. Je dirais, cependant, que d'un défavorisés développeur est beaucoup moins susceptible de produire un produit de qualité. Il peut ne pas être d'exécution des inconvénients, mais imaginer comment hésite un développeur sera de faire de petits changements si chaque compilation prend des heures (voire des jours) pour valider.

Je regarde cela à partir d'une "optimisation prématurée de l'angle": modulaire code dans plusieurs fichiers rend la vie plus facile pour le programmeur, donc il y a un avantage évident à faire les choses de cette façon. Seulement si une application spécifique s'avère exécution trop lente, et il peut être démontré que, d'inlining tout ce qui fait une mesurées amélioration, j'ai même envisager de pénaliser les développeurs. Même alors, il serait d'après une majorité de la mise au point a été fait (de sorte qu'il peut être mesuré) et serait probablement seulement être fait pour de la production s'appuie.

7voto

Nick Points 5293

C'est semi-liés, mais notez que Visual C++ ne ont la possibilité de faire du ski-module d'optimisation, y compris les lier entre les modules. Voir http://msdn.microsoft.com/en-us/library/0zza0de8%28VS.80%29.aspx pour plus d'info.

Pour ajouter une réponse à votre question initiale, je ne pense pas qu'il y aurait un inconvénient au moment de l'exécution, en supposant que l'optimiseur a été assez intelligent (c'est pourquoi il a été ajouté comme une option d'optimisation dans Visual Studio). Il suffit d'utiliser un compilateur assez intelligents pour le faire automatiquement, sans la création de tous les problèmes que vous mentionnez. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X