Convention de code en C++

Introduction

A partir du moment où l’on développe du code, que ce soit seul ou en équipe, il faut quelques conventions pour rendre le code “compréhensible”. Un premier réflexe à avoir est de bien commenter le code. Soit pour les autres développeurs, soit pour les autres personnes intervenant dans le projet et qui seront amenées à lire le code. Pour ce faire, il faut dès le départ avoir une convention de nommage. Une convention de nommage est un ensemble de règles de mise en forme du code. Un très bon ouvrage (High-integrity C++ coding standard manual) traite des lignes de conduites conseillées pour coder en C++. Dans le cas de ce document, elles ne s’appliquent pas toutes. Toutes les conventions, ou lignes de conduites, ne sont fournies qu’à titre informatif.

Nommage

Une convention de nommage est essentielle, si on veut gagner du temps, aussi bien pour intégrer de nouveaux développeurs dans le projet, que pour débugger son code. Une chose est importante lorsque l’on trouve un nom pour une donnée membre (ou une variable) : il faut trouver un nom qui convient. Pour cela, il faut suivre la convention de nommage et en plus trouver un choix judicieux. Un nom ne doit pas être trop long ni trop court. Voici ma convention (mixte entre celle de Microsoft et celle du noyau linux).

gcc

Options -IRépertoire : Ajoute un répertoire à la liste des répertoires connus par le compilateur et dans lesquels, il va rechercher les fichiers inclus avec la directive #include. -g : Inclus les symboles de debug, sans cela pas moyen d’utiliser gdb. -Wall : Active tous les warnings lors de la compilation. -MD : Générer automatiquement les dépendances (fichier *.d). -pg -fprofile-arcs -ftest-coverage : Active l’analyse de coverage. Puis lancer gcov source.

cpp

Classe

Une classe définie un objet. Une classe est semblable à une struct du C. Sans spécification, par l’opérateur de portée, toutes ses données et fonctions (que l’on appelle méthodes) sont privées. Par défaut, elles sont publiques dans une struct.

Voici la définition d’une classe CClasse:

Optimisation C++/Assembleur par l'exemple

Suite à la recopie de mon document sur les optimisations en C++, j'ai eu envie de rejouer avec l'assembleur (ici x86) pour démontrer les notions exposées dans ce document.

Avant tout il faut savoir, comment, demander à gcc de nous compiler un fichier source en assembleur. Cela passe par le paramètre -S :

C++ et l'embarqué sous GNU/Linux

Retirer les patrons STL

Introduction

L’utilisation de la STL dans des projets embarqués pose un problème majeur, celui de la duplication de code dans les objets binaires. En effet les patrons (Qui sont des morceaux de code génériques) sont spécialisés durant la précompilation. On se retrouve vite avec plusieurs kilos de code pour rien. Pour contourner ce problème (Dû aux contraintes du monde embarqué.) il suffit d’encapsuler l’ensemble des patrons utilisés dans une classe à part. Ainsi le code des patrons de la STL sera centralisé dans un binaire, celui de la classe qui encapsule les patrons.
Imaginons qu’un binaire utilise abondamment les patrons STL. Tout d’abord il faut identifier les patrons STL utilisés par le binaire. Il est possible de récupérer la liste en utilisant : nm -C binaire.o.

Recherche de fuites mémoire en C++

Introduction

Pour pouvoir détecter les fuites mémoires, il faut pouvoir garder une trace de toutes les allocations mémoires qui sont faites durant toute l’exécution du programme.
En C++ toutes les allocations de mémoires ce font en utilisant l’opérateur new ou new[] et les libérations de mémoire en utilisant l’opérateur delete ou delete[].

Un moyen simple de garder une trace des allocations ou libérations de mémoire est donc de surcharger l’opérateur new et delete.