2009-10-14 6 views
0

J'ai un espace de travail construit en utilisant MS-Visual Studio 2005 avec tout le code C. Dans ce que je vois beaucoup de fonctions qui ne sont pas appelées mais elles sont compilées. sous n'importe quelle macro de temps de compilation pour les empêcher de compiler).MS VS-2005 L'optimisation du compilateur ne supprime pas le code inutilisé/non exécuté

I définir les paramètres d'optimisation pour le projet MS-VS2005 pour supprimer ce code inutilisé: -

niveau d'optimisation -/Ox

Activer toute l'optimisation du programme -/GL

j'ai essayé deux Faveur speed/Ot et Favor Size/Os

Malgré toutes ces options, quand je vois le fichier de carte généré par le linker, je vois les symboles (fonctions unsed) des noms présents dans le fichier map.

Ai-je raté quelque chose? Je veux supprimer complètement le code inutilisé.

Comment faire?

+0

Comment générer un fichier .map et quel type de projet compilez-vous (.exe? .dll? .lib?). –

Répondre

2

Le compilateur compile les fichiers C un à la fois. Par conséquent, lors de la compilation d'un fichier C qui contient une fonction inutilisée, le compilateur ne peut pas être sûr qu'il ne sera pas appelé à partir d'un autre fichier et donc il compilera également cette fonction. Cependant, si cette fonction est déclarée statique (file-scope), le compilateur saura qu'il n'est pas utilisé et donc l'enlèvera.

Même avec une optimisation complète du programme, je pense que cela ne serait toujours pas fait puisque la compilation pourrait être pour une bibliothèque.

Les Linkers font quelque chose de similaire à ce que vous cherchez. Si votre code est lié à une bibliothèque contenant plusieurs objets, tous les objets qui ne contiennent pas de fonctions utilisées par votre code (directement ou indirectement) ne seront pas inclus dans l'exécutable final. Une option consisterait à séparer votre code en bibliothèques individuelles et en fichiers objets. PS - C'est juste ma conjecture. Le comportement du compilateur (avec l'optimisation du programme entier) ou du linker dépend essentiellement des choix de conception de ce compilateur ou linker particulier

0

Sur nos projets, nous avons un drapeau défini sous les propriétés du projet \ Linker \ Refrences. Nous l'avons défini sur Éliminer les données non référencées (/ OPT: REF), en fonction de la description, ce qui est supposé supprimer les appels de fonction ou les données qui ne sont jamais utilisées. Je vais juste par la description, je n'ai jamais testé cela ou travaillé avec. Mais je suis juste arrivé à le voir au cours de la dernière heure et j'ai pensé que cela pourrait être quelque chose que vous pourriez essayer.

Questions connexes