Object details Une question qui revient souvent dans les séminaires est “Quelle est la taille d'un objet, et à quoi ressemble-t-il ?” La réponse dépend “ce que vous voulez faire d'un struct C.” En fait, le code que le compilateur C produit pour un struct C (avec aucun ornement C++) est souvent exactement le même que celui produit par un compilateur C++. C'est rassurant pour ces programmeurs C qui dépendent des détails de taille et de disposition de leur code, et pour certaines raisons accéder directement aux octets de la structure au lieu d'employer des identifiants (compter sur une taille et une disposition particulières pour une structure est une activité non portable). La taille d'une structure est la taille combinée de tout ses membres. Quelquefois quand le compilateur génère un struct, il ajoute des octets supplémentaires pour faire ressortir nettement les frontières – ceci peut augmenter l'efficacité de l'exécution. Dans le Chapitre 15, vous verrez comment dans certains cas des pointeurs “secret” sont ajoutés à la structure, mais vous n'avez pas besoin de vous en soucier pour l'instant. Vous pouvez déterminer la taille d'un struct en utilisant l'opérateur sizeof. Voici un petit exemple: //: C04:Sizeof.cpp // Taille des structures #include "CLib.h" #include "CppLib.h" #include <iostream> using namespace std; struct A { int i[100]; }; struct B { void f(); }; void B::f() {} int main() { cout << "sizeof struct A = " << sizeof(A) << " bytes" << endl; cout << "sizeof struct B = " << sizeof(B) << " bytes" << endl; cout << "sizeof CStash in C = " << sizeof(CStash) << " bytes" << endl; cout << "sizeof Stash in C++ = " << sizeof(Stash) << " bytes" << endl; } ///:~ Sur ma machine (vos résultats peuvent varier) le premier rapport d'impression donne 200 parce que chaque int occupe deux octets. struct B est une espèce d'anomalie parce que c'est un struct sans données membres. En C c'est illégal, mais dans C++ nous avons besoin de pouvoir créer une structure dont la tache est d'étendre les noms de fonctions, ainsi c'est autorisé. Dans tous les cas, le résultat produit par le deuxième rapport d'impression est une valeur non nulle un peu étonnante. Dans les premières versions du langage, la taille était zéro, mais une situation maladroite surgit quand vous créez de tels objets: Ils ont la même adresse que l'objet créé directement après eux, ils sont donc indistincts. Une des règles fondamentales des objets est que chaque objet a une adresse unique, ainsi les structures sans données membres ont toujours une taille minimale non nulle. Les deux derniers sizeof vous montrent que la taille de la structure en C++ est la même que la taille de la version équivalente en C. Le C++ essaie de ne pas ajouter de suppléments inutiles.