2009-01-22 9 views
3

Je travaille sur un programme C++ et le code objet compilé à partir d'un seul fichier de 1200 lignes (qui initialise une machine d'état assez complexe) sort à près d'un mégaoctet. Qu'est-ce qui pourrait rendre le fichier si grand? Est-il possible de trouver ce qui prend de la place dans le fichier objet?Mon fichier objet C++ est trop gros

Répondre

8

Il peut y avoir plusieurs raisons lorsque les fichiers d'objets sont plus grands que ce qu'ils doivent être au minimum:

  • y compris statiquement bibliothèques dépendantes
  • bâtiment avec des informations de débogage
  • bâtiment avec des informations de profilage
  • création structures de données (extrêmement) complexes utilisant des modèles (peut-être des structures-boost récursives)
  • ne pas activer l'optimisation des drapeaux lors de la compilation (ne sauvegarde pas beaucoup et peut causer des difficultés si utilisé trop fortement)

Dans un premier temps, je suggère de vérifier si vous construisez avec des informations de débogage, cela provoque le plus de ballonnements dans mon expérience.

7

(Je suppose que vous avez des optimisations et l'effacement du code mort activé). Activez l'option «générer le fichier de carte» de votre éditeur de liens et examinez la sortie.

Les coupables courants sont les macros/templates qui produisent de grandes quantités de code et les grands objets globaux.

+1

Il parle cependant d'un fichier objet non lié. –

+0

@Rob K, Les fichiers objets sont liés dans un binaire final. Le binaire a la carte. Ainsi, le binaire contient des parties des fichiers objets. Vous pouvez rechercher des fonctions et des objets dans le fichier source en question et voir leurs tailles. – strager

+0

J'aimerais pouvoir choisir deux réponses. – zaratustra

5

Peut-être quelques instanciations de modèle (en particulier les std::iostream s), et peut-être inlining extensif (c'est-à-dire des classes qui sont entièrement définies dans un en-tête). Cependant, quel est le problème avec un fichier objet de 1 mégaoctet en premier lieu? Lors de la liaison, cela peut très bien se traduire par un minuscule binaire. J'ai un projet ici avec 20 MiB de fichiers objet qui est lié à un binaire de 700 KiB par exemple.

Mise à jour: Peut être également un grand tableau/objet statique. En plus de cela, avec MSVC++ et GCC, vous pouvez regarder l'assemblage généré pour un fichier, ce qui peut vous donner quelques indications (avec GCC, c'est g++ -S foo.cpp, pour MSVC++, c'est '/FAs'). Soit vous verrez un lot des instances de modèle, alors ce sont la raison. Sinon, c'est la taille de l'objet static objets.

-3

Voici une macro que j'utilise pour voir compiler des valeurs de temps:

template <size_t N> struct compile_time_number { private: typedef int check; }; 
#define compiler_check_number(N) ((compile_time_number<N>::check)0) 

Ensuite, allez heureux au moment de la compilation pour voir ce que les symboles prennent l'espace. Edit: Puisque personne ne semble comprendre cela, je vais clarifier: la façon d'utiliser ceci est d'ajouter compiler_check_number(sizeof(<insert struct or global variable here>)). Le compilateur crachera la taille de la variable ou struct comme une erreur de compilation. Le code est très rarement la raison d'un énorme fichier objet. Je l'utilise tout le temps pour voir à quel point les choses sont grandes sans avoir à lancer un débogueur.

+1

La taille d'une structure n'a rien à voir avec la taille d'un fichier objet, sauf si les instances de la structure se trouvent dans le fichier objet. – strager

+0

Oui, mais une variable globale ou statique d'une structure initialisée doit être déclarée quelque part dans le fichier objet, donc la taille de la structure a un effet. Mais dans ce cas, vous devez utiliser la taille de la variable pour commencer. MSN – MSN

0

Une autre raison possible est la génération de code de lien-temps, une option VC++. Cela déplace le backend du compilateur dans l'éditeur de liens. Cela permet de meilleures optimisations, mais le fichier objet doit maintenant contenir toutes les structures de données internes généralement passées entre front et backend.

Questions connexes