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
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.
(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.
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.
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.
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
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
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.
- 1. Mon fichier journal est trop volumineux
- 2. Est-il vilain d'avoir un gros fichier utilitaire?
- 3. Fractionner un gros fichier XML en Python
- 4. Trop de couches d'indirection, est-ce trop?
- 5. Computing MD5SUM de gros fichiers en C#
- 6. Fusion de gros fichiers en C#
- 7. Oracle: chargement d'un gros fichier xml?
- 8. Quel est le moyen le plus simple de découper de gros fichiers XAML dans mon application?
- 9. Pourquoi la moitié de mon compilateur (petit) objectif-C file-t-il un gros bloc de zéros?
- 10. Ma session ASP.NET est-elle trop grande?
- 11. Analyse d'éléments spécifiques à partir d'un très gros fichier HTML
- 12. Où est passé mon fichier validé?
- 13. Bloat Feature - combien est trop?
- 14. Combien de NSTimers est trop?
- 15. C# objet/objet
- 16. L'enregistrement est renvoyé - Message vocal trop court
- 17. jQuery Ajax message de succès montre un gros fichier HTML
- 18. Publication de gros fichiers
- 19. Comment lire des données partielles à partir d'un gros fichier texte en C++
- 20. Le framerate animé * .gif est trop élevé
- 21. Quelle est l'efficacité de SBCL pour stocker de gros graphiques?
- 22. Est-ce important de savoir s'il y a des fonctions inutilisées que je mets dans un gros fichier CoolFunctions.h/CoolFunctions.m qui est inclus partout dans mon projet?
- 23. RoR: Comment m'assurer qu'un seul objet est assigné à mon objet?
- 24. Requêtes SQL - Comment lent est trop lent?
- 25. Est-il possible de stocker seulement une somme de contrôle d'un gros fichier dans git?
- 26. Ma page d'index est-elle trop grande?
- 27. Bash == opérateur dans [[]] est trop intelligent!
- 28. Google Map InfoWindow est trop large
- 29. mysql - combien de colonnes est trop?
- 30. télécharger de gros fichiers vidéo sur l'iPhone
Il parle cependant d'un fichier objet non lié. –
@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
J'aimerais pouvoir choisir deux réponses. – zaratustra