Je ne m'étais jamais posé la question de savoir combien de place une structure (ou classe) dépourvue d'attribut prenait de place en mémoire. Spontanément j'aurais dit "zéro" si on m'avait posé la question sans prendre le temps de vérifier ou réfléchir.
Ainsi donc les traits, par exemple, ou bien d'autre classes de la STL ne servant qu'à faire du "typage", sont vides et pourtant leur sizeof() est égal à 1.C'est curieux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 struct rien_du_tout { }; cout << "résultat: " << sizeof(rien_du_tout) << endl; résultat: 1
Mais par ailleurs, si sizeof()==0, comment instantier un objet de rien_du_tout ? Comment imaginer le comportement d'un pointeur vers un emplacement en mémoire d'une instance de rien_du_tout ?Bon, soit...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 struct un_peu: rien_du_tout { char c; }; cout << "résultat: " << sizeof(un_peu) << endl; résultat: 1
Mais ça m'embête un peu. J'aimerais quand même que sizeof(rien_du_tout)==0.
Prenons par exemple le cas d'un list< vector<int> > ou d'un list< string > où on consomme de la mémoire "en trop" pour rien. En cause std::allocator qui est une classe "vide" (sous Visual en tout cas) mais qui est "instanciée" dans chaque vector, dans chaque string aussi (et dans tous les conteneurs en général). Et pour peu que l'on fasse un alignement en mémoire (c'est le cas par défaut) on perd 4 octets à chaque instance. C'est cher payé pour "rien".
Pour une fois on aimerait bien que std::allocator soit instanciée une bonne fois pour toute dans une variable globale, d'autant plus que les allocators autre que le standard ne sont pas légions. Dans Loki je crois qu'il y a un SmallObjectAllocator, c'est le seul autre que je connaisse.
J'ai aussi déjà posé la question sur le forum afin de savoir si quelqu'un s'était lancé dans l'écriture d'un allocator, ou les régles à respecter pour le faire. Sans beaucoup de succès...
Bref, pourquoi sizeof(rien_du_tout)==1 et non pas 0 ?
Partager