Lorsque j'inclus une fonction d'un fichier d'en-tête dans un programme C ++, le code de fichier en-tête complète est-il copié sur l'exécutable final ou que seul le code de la machine pour la fonction spécifique est généré. Par exemple, si j'appelle Je pense qu'une question similaire existe quelque part sur le débordement de la pile, mais j'ai fait de mon mieux pour le trouver (je l'ai jeté un coup d'œil une fois, mais j'ai perdu le lien). Si vous pouvez me signaler cela, ce serait merveilleux. p> std :: trier code> à partir du
4 Réponses :
En fait, l'ensemble du fichier est copié dans le fichier .CPP, et cela dépend du compilateur / de la liaison, s'il ne prend que des fonctions «nécessaires», ou toutes. p>
En général, Résumé simplifié: P>
plus cela dépend des attributs -> La fonction déclarée pour l'exportation ne sera jamais dépouillée. De l'autre côté, les variantes de la fonction de modèle sont "générées" lorsqu'elles sont utilisées, de sorte que celles que vous utilisez explicitement sont compilées. P>
EDIT: Le code de fichier d'en-tête n'est pas généré, mais dans la plupart des cas écrits à la main. P>
Si vous Les en-têtes généralement contiennent des déclarations, c'est-à-dire des informations sur ce qui se trouve à l'intérieur d'une bibliothèque. De cette façon, le compilateur vous permet d'appeler des choses pour lesquelles le code existe en dehors de l'unité de compilation actuelle (par exemple, le fichier .cpp, vous incluez l'en-tête de). Lorsque le programme est lié à un exécutable que vous pouvez exécuter, le lien de liaison décide de savoir quoi inclure, généralement basé sur ce que votre programme utilise réellement. Les bibliothèques peuvent également être liées de manière dynamique, ce qui signifie que le fichier exécutable n'inclut pas réellement le code de la bibliothèque, mais la bibliothèque est liée au moment de l'exécution. P> #include code> Un fichier d'en-tête dans votre code source, il agit comme si le texte de cet en-tête était écrit à la place de la directive code> pré-transprocesseur. < / p>
Vous mélangez deux problèmes distincts ici: P>
Ceux-ci sont simplement copiés Verbatim par le préprocesseur dans l'endroit où La plupart des lieurs modernes ne relieront pas aux fonctions qui ne sont pas appelées dans votre application. C'est à dire. Écrivez une fonction Cela dit, les modèles C ++ compliquent la matière un peu plus loin. C'est un problème complexe à expliquer ici, mais en quelques mots, les modèles sont développés par le compilateur pour tous les types que vous utilisez réellement. Donc si avoir un inclure code> s. Tout le code de
algorithme code> est copié dans le fichier
.cpp code> lorsque vous
#include
Liaison sélective H2>
FOO code> et n'en appelez jamais - son code ne sera pas dans l'exécutable. Donc, si vous
#include
trier code> voici ce qui se passe: p>
trier code> li>
trier code> (et fonctionne cela appelle, le cas échéant) à l'exécutable. Le code des autres algorithmes ne s'ajoute pas Li>
ul>
vecteur code> de
int code> et un
vecteur code> de
chaîne code>, le compilateur générera deux copies de l'ensemble Code pour la classe code> de la classe code> dans votre code. Puisque vous l'utilisez (sinon, le compilateur ne le générerait pas), le linker le place également dans l'exécutable. P>
Cela dépend du compilateur. La plupart des compilateurs aujourd'hui effectuent une analyse de flux pour élaborer des fonctions non qualifiées. http://fr.wikipedia.org/wiki/data-flow_analysis P >