Une raison fondamentale est qu'il n'y a pas de différence entre un pointeur vers le premier élément d'un tableau alloué dynamiquement de T
et un pointeur vers n'importe quel autre T
.
Considérons un fictifs fonction qui renvoie le nombre d'éléments d'un pointeur pointe.
Appelons cela la "taille".
Sons vraiment sympa, non?
Si ce n'était pas pour le fait que tous les pointeurs sont créés égaux:
char* p = new char[10];
size_t ps = size(p+1); // What?
char a[10] = {0};
size_t as = size(a); // Hmm...
size_t bs = size(a + 1); // Wut?
char i = 0;
size_t is = size(&i); // OK?
On pourrait dire que le premier devrait être 9
, le deuxième 10
, le tiers - 9
, et le dernier 1
, mais pour ce faire, vous devez ajouter un "taille de la balise" sur chaque objet.
Un char
exigera 128 bits de stockage (en raison de l'alignement) sur une machine 64 bits. C'est seize fois plus que ce qui est nécessaire.
(Ci-dessus, le dix-tableau de caractères a
aurait besoin d'au moins 168 octets.)
Cela peut être pratique, mais il est également inacceptable cher.
Vous pouvez bien sûr imaginer une version qui n'est bien défini si l'argument est vraiment un pointeur vers le premier élément d'une allocation dynamique par défaut operator new
, mais ce n'est pas aussi utile qu'on pourrait le penser.