Une fonction pour interroger la taille d’un bloc alloué?

Je me rends compte qu’une telle fonction est susceptible d’être non standard, mais c’est correct pour mon cas d’utilisation. En gros, j’ai besoin d’une méthode (même si elle n’est exposée qu’à travers l’interface syscall () de glibc) à laquelle je peux transmettre un pointeur (un pointeur renvoyé par un précédent appel à malloc ()) qui renvoie la taille du bloc. points à. Est-ce qu’une telle chose existe?

Autant que je sache, cette fonction n’existe pas du moins dans C90 / C99. Certains systèmes, principalement la libc, fournissent des fonctions pour obtenir la taille allouée (par exemple, malloc_size () sous Mac OS X), mais ceci n’est pas portable et vous devriez probablement éviter de l’utiliser au mieux.

Il n’est pas nécessaire d’utiliser des fonctions non standard, il n’est pas difficile d’écrire votre propre allocateur avec les fonctionnalités nécessaires.

Vous devez connaître la taille lorsque vous allouez le bloc, alors conservez simplement ces informations. Il existe peu de situations à l’OMI où vous ne pourriez pas connaître cette information, puisque par définition, vous le saviez au moment de son affectation. Toutefois, si vous avez besoin de cette fonctionnalité, vous pouvez le faire simplement en encapsulant malloc () et en pré-en attendant la taille du bloc.

void* smalloc( size_t size ) { // allocate block with additional space for size void* blk = malloc( size + sizeof(size_t) ) ; // set the size *((size_t*)blk) = size ; // return pointer to block after size field (user block) return ((size_t*)blk) + 1 ; } void sfree( const void* blk ) { // Free from the size field address, not the user block free( ((const size_t*)blk) - 1 ) ; } size_t ssize( const void* blk ) { // Size is immediately before user block return *(((size_t*)blk) - 1) ; } 

Sur le sharepoint Jim Buck; Sur certaines cibles, des secousses peuvent être nécessaires pour préserver l’alignement nécessaire. Certaines cibles génèreront un code moins efficace si l’alignement n’est pas optimal, d’autres provoqueront un abandon. Alors méfiez-vous de cette solution. Personnellement, je me méfie du besoin de cette solution!

Une solution consisterait peut-être à utiliser une structure de données telle qu’une table de hachage avec l’adresse malloc comme clé et la taille comme contenu, et en utilisant la même technique d’encapsulation, stockez la taille séparément du bloc, au désortingment de la performance. stockage supplémentaire, et peut-être une limite finie de la capacité en termes de nombre de blocs pouvant être gérés.

Quoi que vous fassiez, le point fondamental rest valable: encapsulez le service de base pour vous fournir ce dont vous avez besoin.

_size sur les plates-formes Windows.