2010-05-23 4 views
0

Je voudrais réellement allouer seulement 64 Ko de mémoire, pas 128 Ko et ensuite faire l'alignement manuellement - beaucoup trop gaspillage. VirtualAlloc sur Windows donne précisément ce comportement. Apparemment, il y a du code dans SquirrelFish pour faire cela sur à peu près toutes les plateformes, mais je n'ai pas réussi à le localiser. Existe-t-il un moyen efficace d'allouer 64 Ko sur une limite de 64 Ko dans POSIX? A défaut, sous Linux?POSIX: allouer 64 Ko sur la limite de 64 Ko

+0

Je suis assez curieux quant à l'application de ceci - vous voyez rarement des situations d'espace utilisateur nécessitant plus que l'alignement de la taille d'une page. – caf

+0

@caf: Je suppose que OP voulait utiliser les 16 bits inférieurs du pointeur pour stocker des informations supplémentaires. Soit cela, soit écrire x86 asm où la partie 16 bits d'un registre 32 bits sera modifiée en l'utilisant pour quelque chose d'autre, ou même éventuellement où 'eax' est un pointeur et 'al' et' ah' sont x et y coordonnées dans une image 256x256 ou quelque chose ... –

Répondre

8

Découvrez posix_memalign(3)

SYNOPSIS

#include <stdlib.h> 

int 
posix_memalign(void **memptr, size_t alignment, size_t size); 

DESCRIPTION

The posix_memalign() function allocates size bytes of memory such that 
the allocation's base address is an exact multiple of alignment, and 
returns the allocation in the value pointed to by memptr. 

Vérifiez la page de manuel pour plus de détails ...

+0

Cela fonctionnerait. Bien sûr, si c'est 128 Ko en interne, puis retourner un pointeur vers un point proche du milieu qui est aligné sur une limite de 64 Ko, ce serait inacceptable pour moi. Je vais devoir vérifier le code source et voir comment il est implémenté. – Eloff

+2

La façon dont il est implémenté dans libc est de malloc (taille + 2 * alignement) et ensuite trouver la partie alignée au milieu. Mais il tentera alors de renvoyer toute la partie tête et queue de la mémoire dans le tas si elle est assez grande, donc ce n'est pas aussi inutile que je le craignais. Ça va marcher. – Eloff

0

Vous pouvez utiliser mmap() avec MAP_PRIVATE. De nos jours, plusieurs allocateurs de libc utilisent en interne mmap() pour obtenir des blocs de mémoire à allouer.

0

Bien sûr, posix_memalign est la solution élégante, mais même si vous allouez 128k, toutes les pages intactes resteront comme des pages de zéro sur copie et utiliseront des ressources physiques minimales. Vous pouvez aussi utiliser mmap avec MAP_PRIVATE pour faire une carte de 128k, puis munmap n'importe quelles parties de celui-ci sont non alignées.

Questions connexes