2010-07-18 4 views
2

La compilation se fait à la volée: uniquement des fonctionnalités CIMG vraiment utilisées par votre programme sont compilés et apparaissent dans le programme exécutable compilé. Cela conduit à un code très compact, sans aucune substance inutilisée.Pourquoi CImg peut-il réaliser ce genre d'effet?

Quelqu'un connaît le principe?

+0

Quelle est la source de cette citation? –

+0

CImg est un projet open source. – user198729

+1

@jeff: http://cimg.sourceforge.net/reference/group__cimg__overview.html – kennytm

Répondre

6

CImg est une bibliothèque d'en-tête uniquement, et ils utilisent des modèles généreusement, ce qui est ce qu'ils se réfèrent à.

S'ils ont utilisé une bibliothèque précompilée d'une sorte (.dll/.lib/.a/.so) le fichier de bibliothèque devrait contenir la bibliothèque CImg toute, quel que soit les bits de celui-ci que vous utilisez réellement.

Dans le cas d'une bibliothèque liée statiquement (.lib ou .a), l'éditeur de liens peut puis supprimer les symboles inutilisés, mais cela peut dépendre des paramètres d'optimisation. Lorsque la bibliothèque entière est incluse dans un ou deux en-têtes, elle n'est réellement compilée que lorsque vous la mettez à #include. Elle fait donc partie du même processus de compilation que le reste de votre programme et le compilateur peut facilement déterminer des parties de la bibliothèque sont utilisées, et celles qui ne le sont pas.

Et parce que l'API CImg utilise des modèles, aucun code n'est généré pour les fonctions qui ne sont jamais appelées.

Ils sont survente un peu cependant, parce que les autres réponses indiquent, les symboles inutilisés seront généralement dépouillé de toute façon .

2

Cela me semble un comportement assez standard - un éditeur de liens C++ jette généralement toutes les références de bibliothèque inutilisées au lieu d'inclure du code non alloué. De même, une version optimisée n'inclura pas de code non disponible.

+0

Vous voulez dire que cette fonctionnalité est automatiquement disponible pour un éditeur de liens C++? – user198729

+0

Selon la publication de Necrolis, oui. –

0

Cela ressemble Eliminate Unreferenced Data (/OPT:REF) la commande de liaison de MSVC, GCC devrait avoir quelque chose de similaire trop cela aussi