31 votes

Outil d'analyse de code pour une disposition optimale des membres

Comme vous le savez, réorganiser les membres de la classe peuvent augmenter ou diminuer la taille d'une classe en raison de rembourrage et de l'alignement.

Est-il un outil qui analyse une base de code et vous permet de savoir où les sous-optimale membre disposition se produit? Par exemple, il devrait drapeau

struct X 
{
   char a;
   int  b;
   char c;
};
//sizeof = 12

et éventuellement vous recommander:

struct X
{
   int b;
   char a;
   char c;
};
//sizeof = 8

C'est une rétréci en bas exemple évidemment, la tâche est beaucoup plus complexe lorsque les classes ont d'autres classes comme membres, et ainsi de suite, et de l'analyse manuelle est un gaspilleur. J'aimerais essayer les solutions existantes avant d'essayer ma main à l'écriture de l'outil de moi-même.

Je sais que la réorganisation n'est pas toujours une bonne chose, mais je tiens à analyser au cas par cas moi-même.

7voto

Richard Points 418

PVS Studio indiquera si une taille peut être réduite en réorganisant les membres. http://www.viva64.com/en/pvs-studio/ Pas gratuit mais offre un essai gratuit

C'est un addon pour Visual Studio

2voto

Ira Baxter Points 48153

Je doute que vous allez trouver un tel outil sur l'étagère, pour votre dialecte de C++.

Un tel outil doit être capable d'analyser le code C++ (dans votre cas, Microsoft C++) avec la même précision que votre compilateur, de sorte qu'il sait de l'une information précise sur les types de membres pour les types d'instance (y compris le modèle d'instanciations). Alors pour vous parler de "l'amélioration", il doit savoir ce que votre local compilateur ne fait; sans doute il est d'une certaine liberté dans la norme C++ pour accomplir mise en page.

Il y a du plaisir complications:

  • ce qui est optimal "mise en page" pour une classe de modèle? Cela doit dépendre fortement les arguments de modèle. Donc, vous auriez probablement obtenir des réponses différentes en fonction de la instantions.

  • C++ classes héritent. L'optimisation d'un enfant pourrait avoir besoin de réorganiser les membres d'un parent, deoptimizing il. Si ce qui compte pour un "espace total consommé" dépend du nombre d'instances de chaque vous avez, alors maintenant vous statistique des données d'utilisation.

Par conséquent, l'analyse pourrait être assez sophistiqué.

Je suis toujours (agréablement) surpris par les questions que les gens dans l'analyse du programme, la plupart d'entre eux (comme le vôtre) bien motivé pour certains à des fins pratiques. Le fait qu'aucun outil existe dans la plupart des cas implique la nécessité d'personnalisable de l'outillage.

Notre Logiciel DMS Réingénierie Toolkit est un programme personnalisable analyse et la transformation de l'outil (si vous avez déterminé un ordre différent était mieux, vous pouvez utiliser DMS pour réellement modifier le code). Il en a plein le C++ frontaux couvrant GCC4 ainsi que Microsoft dialectes, qui complète les tables de symboles contenant les noms et les types de programmes d'artefacts.

Ce qu'il ne sait pas, c'est précisément la taille des entités (comme intepreted par Microsoft) ou à un espace de règles d'emballage; vous auriez à déterminer ces et de prévoir que, dans le cadre de la personnalisation. Avec cette base, vous pouvez alors générer un code personnalisé pour répondre à votre question, modulo les questions abordées ci-dessus.

La personnalisation d'un outil complexe pour une langue complexe n'est pas pour les faibles de cœur, et il ne serait pas ce que l'on pourrait appeler facile. Si elle vaut la peine l'effort est motivée par le profit à partir du résultat, et c'est un jugement sur l'organisation de la partie. Mais si vous ne pouvez pas trouver une solution commerciale, et le gain est décent, DMS est une réponse réaliste.

Vous avez Clang et de la GCC en tant que solutions de rechange que vous pouvez personnaliser. Clang peut-être sorte de l'équivalent de la complexité de la personnalisation, mais il y a une tentative de faire de Clang personnalisable; GCC pas fermer. Je ne pense pas que ce soit de leur processus de MME C++ dialectes, mais je peux me tromper.

1voto

Benjamin Bannier Points 11953

GCC envoie un avertissement si un bourrage est ajouté à structs (également des classes pour C ++). Cela ne vous donne pas de suggestions, mais une fois que vous savez où trouver un meilleur ordre de membre, ce n'est pas si difficile. Activer avec -Wpadded .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X