Deux choses doivent être clarifiées ici.
Premièrement : l'hypothèse selon laquelle malloc
conserve la taille précise demandée.
Pas vraiment. malloc
ne se préoccupe que de fournir un bloc suffisamment grand. Bien que, pour des raisons d'efficacité, il ne surallouera probablement pas beaucoup, il vous donnera probablement un bloc d'une taille "standard", par exemple un bloc 2^n
bloc d'octets. Par conséquent, la taille réelle (c'est-à-dire le nombre d'objets réellement alloués) est en fait inconnue.
Deuxièmement : le "petit plus" requis
En effet, l'information nécessaire pour qu'un objet donné sache s'il fait partie d'un tableau ou non serait simplement un bit supplémentaire. Logiquement.
En ce qui concerne la mise en œuvre : où placer ce bit ?
La mémoire allouée à l'objet lui-même ne devrait probablement pas être touchée, car c'est l'objet qui l'utilise après tout. Alors ?
- sur certaines plates-formes, cela pourrait être conservé dans le pointeur lui-même (certaines plates-formes ignorent une partie des bits), mais ce n'est pas portable
- Cela nécessiterait donc un stockage supplémentaire, d'au moins un octet, sauf qu'en cas de problèmes d'alignement, il pourrait bien s'agir de 8 octets.
Démonstration : (pas convaincant comme noté par qqch, voir ci-dessous)
// A plain array of doubles:
+-------+-------+-------
| 0 | 1 | 2
+-------+-------+-------
// A tentative to stash our extra bit
+-------++-------++-------++
| 0 || 1 || 2 ||
+-------++-------++-------++
// A correction since we introduced alignment issues
// Note: double's aligment is most probably its own size
+-------+-------+-------+-------+-------+-------
| 0 | bit | 1 | bit | 2 | bit
+-------+-------+-------+-------+-------+-------
Humpf !
EDIT
Par conséquent, sur la plupart des plates-formes (où l'adresse compte), vous devrez "étendre" chaque pointeur et doubler leur taille (problèmes d'alignement).
Est-il acceptable que tous les pointeurs soient deux fois plus grands uniquement pour que vous puissiez cacher ce bit supplémentaire ? Pour la plupart des gens, je suppose que oui. Mais le C++ n'est pas conçu pour la plupart des gens, il est principalement conçu pour les personnes qui se soucient des performances, que ce soit la vitesse ou la mémoire, et en tant que tel, ce n'est pas acceptable.
FIN DE L'EDIT
Quelle est donc la bonne réponse ? La bonne réponse est que la récupération des informations perdues par le système de typographie est coûteuse. Malheureusement.