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
Répondre
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 ...
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
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
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.
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.
- 1. Log4net avec SyslogAppender, limite de message de 1 Ko
- 2. Pourquoi seulement 64 Ko de données sont sauvegardées dans ma colonne de données MySQL?
- 3. Mémoire insuffisante avec 640 Ko d'octets actifs?
- 4. ThreadPool - WaitAll 64 Poignée limite
- 5. Dois-je diffuser mes données sur plusieurs cookies pour contourner la limite de 4 Ko?
- 6. Dépassement de la limite de 8 ko au paramètre de procédure stockée du serveur SQL
- 7. SQL Server 8 Ko maximum par ligne?
- 8. comment casser la limite 64 lors de l'utilisation WSAEventSelect
- 9. octets (1024) à la conversion de chaîne (1 Ko)?
- 10. Obtenez la Ko ou la vitesse d'un téléchargement dans .NET
- 11. Pourquoi mon noyau ne tombe-t-il pas en panne lorsque j'utilise un peu plus de 64 ko de cache constant? (OpenCL/CUDA)
- 12. Quelle est la limite de taille de fichier objet ELF sur la plate-forme 64 bits?
- 13. Processus Limite de mémoire du processus 64 bits
- 14. Comment charger un fichier texte de 150 ko (kilo-octets) dans sql server 2008?
- 15. Erreur d'exécution binaire 64 bits sur les Centos 64 bits
- 16. Le module POSIX de la distribution Perl standard fonctionne-t-il sous Win32/64?
- 17. Interlocked * 64 sur WinXP 32bit
- 18. Regex match 1024 Ko convertir à 1 Mo?
- 19. dbxtool sur Linux 64 bits ne chargera pas la version 64 bits de dbx?
- 20. Expérience de la migration vers la JVM 64 bits
- 21. Limite d'allocation de mémoire pour une application 32 bits sur un système 64 bits
- 22. Comment puis-je obtenir l'utilisation totale de GPRS en Ko sur un périphérique Windows Mobile?
- 23. Pourquoi Safari vous permet-il de définir des cookies sur 4 Ko?
- 24. Ciblage 64 bits
- 25. ImagExpress Version 8 sur 64 bits
- 26. Configuration JVM sur Linux 64 bits
- 27. Application DirectX sur les fenêtres 64 bits
- 28. NCover sur le système 64 bits
- 29. va_args et 64 bits
- 30. TAPI sur Windows 2008 Édition 64 bits
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
@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 ... –