Pourquoi n’y a-t-il pas de «taille de mémoire» en C qui renvoie la taille d’un bloc de mémoire alloué dans le tas à l’aide de malloc?

D’accord. On peut appeler n’importe quoi d’autre comme dans _msize dans Visual Studio.

Mais pourquoi n’est-il pas dans la norme de retourner la taille de la mémoire étant donné le bloc de mémoire alloué avec malloc? Puisque nous ne pouvons pas dire combien de mémoire est pointée par le pointeur de retour suivant malloc, nous pourrions utiliser cet appel “memsize” pour renvoyer cette information si nous en avions besoin. “memsize” serait spécifique à l’implémentation, tout comme malloc / free

Il suffit de demander car je devais écrire un wrapper afin de stocker des octets supplémentaires pour la taille.

Parce que la bibliothèque C, y compris malloc , a été conçue pour minimiser les frais généraux. Une fonction telle que celle que vous souhaitez exigerait que l’implémentation enregistre la taille exacte de l’allocation, tandis que les implémentations peuvent désormais choisir “arrondir” la taille à leur convenance, pour éviter toute réaffectation réelle dans realloc .

Le stockage de la taille nécessite un size_t supplémentaire par allocation, ce qui peut être lourd pour les systèmes intégrés. (Et pour les PDP-11 et les 286 qui étaient encore abondants au moment de l’écriture de C89.)

Pour renverser la situation, pourquoi devrait-il y en avoir? Il y a déjà beaucoup de choses dans les standards, en particulier le standard C ++. Quels sont vos cas d’utilisation?

Vous demandez un bloc de mémoire de taille adéquate et vous l’obtenez (ou un pointeur ou une exception null). Des octets supplémentaires peuvent être atsortingbués ou non, et certains d’entre eux peuvent être réservés. C’est conceptuellement simple: vous demandez ce que vous voulez et vous obtenez quelque chose que vous pouvez utiliser.

Pourquoi le compliquer?

Je ne pense pas qu’il y ait de réponse définitive. Les développeurs de la norme l’ont probablement considérée et ont pesé le pour et le contre. Tout ce qui entre dans une norme doit être implémenté par chaque implémentation, de sorte que son ajout impose un lourd fardeau aux développeurs. Je suppose qu’ils n’ont tout simplement pas trouvé cette fonctionnalité assez utile pour le justifier.

En C ++, le wrapper dont vous parlez est fourni par le standard. Si vous allouez un bloc de mémoire avec std :: vector , vous pouvez utiliser la fonction membre vector :: size () pour déterminer la taille du tableau et utiliser vector :: capacity () pour déterminer la taille de l’allocation sois différent).

C, en revanche, est un langage de bas niveau qui laisse de telles préoccupations à la charge du développeur, car le suivre de manière dynamic (comme vous le suggérez) n’est pas ssortingctement nécessaire et serait redondant dans de nombreux cas.