Question

Je développe une bibliothèque d'usage général qui utilise Win32 HeapAlloc

MSDN ne mentionne pas les garanties d'alignement pour la HeapAlloc de Win32, mais je vraiment besoin de savoir ce que l'alignement utilise, donc je peux éviter un rembourrage excessif.

Sur ma machine (vista, x86), toutes les allocations sont alignées à 8 octets. Est-ce vrai pour d'autres plates-formes aussi bien?

Était-ce utile?

La solution

La fonction HeapAlloc ne précise pas les garanties d'alignement dans la page MSDN, mais je suis enclin à penser qu'il devrait avoir les mêmes garanties de GlobalAlloc, qui est garanti de retour aligné (bien que reposant sur les fonctionnalités non documentées mémoire 8 octets est mal); après tout, il est dit explicitement que Global / LocalAlloc ne sont que des emballages autour HeapAlloc (bien qu'ils puissent Rejeter les n octets pour obtenir aligné mémoire - mais je pense qu'il est très peu probable).

Si vous voulez vraiment être sûr, il suffit d'utiliser GlobalAlloc, ou même VirtualAlloc, dont la granularité est la granularité de page, qui est habituellement de 4 Ko (IIRC), mais dans ce cas pour les petites allocations que vous allez perdre beaucoup de mémoire .

Par ailleurs, si vous utilisez nouvel opérateur de C, vous êtes assuré d'obtenir la mémoire correctement aligné pour le type que vous avez spécifié. Cela pourrait être le chemin à parcourir

Autres conseils

Étonnamment, Google se présente preuve que HeapAlloc est pas toujours conforme SSE:

  

HeapAlloc () a tous les objets toujours 8 octets alignés, quelle que soit leur taille est (mais non aligné 16 octets, pour SSE).

Le poste est de mi-2008, ce qui suggère que la récente Windows XP souffre de ce bug.

Voir aussi http://support.microsoft.com/kb/286470 :

  

Les gestionnaires de tas Windows (toutes les versions) ont toujours garanti que les allocations de tas ont une adresse de départ qui est aligné 8 octets (sur les plates-formes 64 bits l'alignement est de 16 octets).

L'alignement sera telle que l'adresse de retour peut être coulé à un pointeur de type quelconque. Sinon, vous ne serez pas en mesure d'utiliser la mémoire dans votre application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top