Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : GetMem et compagnie [ Système / Mémoire ] (florenth)

mercredi 2 juillet 2008 à 22:02:22 | GetMem et compagnie

florenth

Membre Club
Salut à tous,

Je me demandais, en adaptation d'un code C, s'il fallait modifier les fonctions d'allocation de mémoire par rapport au code original.

En effet, on a plein de fonctions qui permettent d'allouer de la mémoire:
  • GetMem
  • GlobalAlloc
  • VirtualAlloc
  • HeapAlloc
et bien sûr toutes les fonctions de libération associées.

Mais finalement, quelle est la différence entre tout ça ?
Si j'ai besoin d'un buffer de N octets, que vaut-il mieux prendre ?

J'avais vu avec forman que dans certains cas on pouvait utiliser VirtualAlloc et demander à ce que tout soit dans une même page de mémoire pour éviter un bug avec GetDIBits(), mais finalement, je n'y comprends plus rien...

La fonction à appeler dépend-elle de la taille du buffer à allouer (par exemple, GetMem bien pour N petit, mais HeapAlloc pour N "grand" ?) ou en fonction de l'utilisation à faire de la mémoire ?

Bref, peu importe ce que vous savez là dessus, ça m'intéresse !
Merci d'avance !

Flo
[ Lien ]

jeudi 3 juillet 2008 à 04:08:02 | Re : GetMem et compagnie

f0xi

Membre Club Administrateur CodeS-SourceS

VirtualAlloc

Reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero, unless MEM_RESET is specified.

To allocate memory in the address space of another process, use the VirtualAllocEx function.



HeapAlloc

Allocates a block of memory from a heap. The allocated memory is not movable.


GlobalAlloc

Allocates the specified number of bytes from the heap.

Note  The global functions are slower than other memory management functions and do not provide as many features. Therefore, new applications should use the heap functions. However, the global functions are still used with DDE, the clipboard functions, and OLE data objects.



sinon je pense que brunews expliquerais mieux que moi la difference entre VirtualAlloc et GetMem.

je sais que lui qui travail beaucoup avec SSE et pas seulement, utilise VirtualAlloc pour une question "d'allignement des données". j'ai jamais vraiment saisis la nuance.

je pense ensuite qu'il y a une difference de "cible" dans ces fonctions.
GetMem alloue de la memoire mais on a peu de control sur cette allocation. mis a part l'accés en I/O sur la donnée pointée ... on peu pas faire grand chose de plus.

VirtualAlloc ressemble fort a GetMem, mais fournit plus de control, apparement il semble qu'on puisse allouer des zone en I/O, I ou O, mais la encore, les subtilitées m'echape.






jeudi 3 juillet 2008 à 11:57:31 | Re : GetMem et compagnie

florenth

Membre Club
J'avais bien vu la doc de la msdn.
Mais quelle différence entre le "tas" (heap) et la mémoire "virtuelle".
Y'en a une plus rapide que l'autre ?

Parce que justement, comme VirtualAlloc permet à la mémoire d'être en R, W ou RW, c'est qu'il y a un mécanisme de contrôle... donc ça ralentit.
J'ai vu aussi que VirtualAlloc permet de choisir si on veut que la mémoire reste dans la RAM ou si on autorise Windows à la mettre dans le fichier d'échange.
J'ai aussi vu que cette fonction permet de choisir l'adresse qu'on voudrait allouer, et elle se débrouille pour trouver de la mémoire libre "pas trop loin". A quoi ça peut bien servir ?

Tout ça pour dire que je cherche à manipuler un flux audio, avec le moins de latence possible, donc je voudrais la méthode qui me donne le max de perfs, mais aussi savoir comment fonctionne le chmilblic.

A noter que GetMem est une fonction fouirnie par Delphi (équivalent je pense au malloc du C) alors que les autres sont des fonctions de Windows.

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]

jeudi 3 juillet 2008 à 17:30:57 | Re : GetMem et compagnie

f0xi

Membre Club Administrateur CodeS-SourceS

alors si je me souviens bien,

le heap c'est la memoire dynamique allouée en runtime au programme, il me semble que ce sont les quelques rares kilo-octets que l'on peu definir dans le compilo ou par directive de compilation.
je risque de dire une connerie mais heap memory fait surrement reference a la "stack".



$00004000 = 16384 octets
$00100000 = 1048576 octets (1Mo)
$00400000 = 4194304 octets (4Mo)

par contre, virtualalloc alloue la memoire dans l'espace virtuel, soit donc, la ram physique disponible, le cache disque ou la memoire paginné. donc a moins d'une ram pleine a ras bord et d'un disque dur plein a craquer, il est rare d'etre out of resources contrairement au tas qui est tout petit petit et vite remplis.

a mon avis, prendre la ram physique est ce qu'il y a de mieux puisque c'est celle qui a l'accés le plus rapide (d'une centaines de Mo a plusieurs Go de bande passante).





jeudi 3 juillet 2008 à 17:35:41 | Re : GetMem et compagnie

f0xi

Membre Club Administrateur CodeS-SourceS

sinon d'aprés ce que j'ai pus voir dans les sources delphi (system) GetMem semble utiliser VirtualAlloc.





jeudi 3 juillet 2008 à 19:08:13 | Re : GetMem et compagnie

florenth

Membre Club
Oui, il me semble que le tas et la pile utilisent le même espace mémoire: l'un le remplit par en bas et l'autre par en haut.

Alors, pour mon truc sonore, je 'ai pas besoin de beaucoup de mémoire (genre max 20~30 Ko) donc autant taper dans le tas , c'est à dire via HeapAlloc, puisque c'est de la mémoire entièrement physique, non

Par contre, si je veux avoir un "undo" de mes opérations de bitmap, alors je dois prendre dans la mémoire virtuelle, plus grosse...

J'ai tout bon ?

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]

vendredi 4 juillet 2008 à 02:45:22 | Re : GetMem et compagnie

f0xi

Membre Club Administrateur CodeS-SourceS

moi j'utiliserais pas la pile. parce que parfois tu pourrais ne pas avoir les 20-30Ko dispo.

pour un undo, oui, memoire virtuelle mais mieux c'est le cache disque.




vendredi 4 juillet 2008 à 11:13:22 | Re : GetMem et compagnie

florenth

Membre Club
Je peux faire un test et allouer ailleurs si jamais c'est pas disponible.
Mais avant, il faudrait savoir si ça vaut le coup (niveau rapidité) ou pas.

Pour le undo, si tu dis que VirtualAlloc peut choisir l'emplacement, alors c'est tout bon. Mais c'est sur que si tu as 60Mo à prévoir, là je pense que le disque serait utile pour les 55 derniers Mo et la mémoire virtuelle pour les 5Mo restants (car plus susceptibles d'être "undoés".

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.net [ Lien ]



Cette discussion est classé dans : code, mémoire, fonctions, compagnie, getmem


Répondre à ce message

Sujets en rapport avec ce message

Exploitation de Code Source téléchargé [ par damene ] Bonjour tout le monde.Je suis débutant et j'essaie de me documenter en lisant les questions et réponses du forum.Chaque fois que je lélécharge des cod GLFont et adresse mémoire [ par lp0683 ] Bonsoir à tous,bon je vais essayé d'être claire en cette heure tardive ...J'essaye un peu par tout les moyens d'afficher du texte sous OpenGL. J'ai tr gestion de la pharmacie en VB2008 [ par culturation ] salut j'ai un projet de fin d'étude sur la gestion de la pharmacie en visuel basic 2008.J'en ai besoin d'avoir une idée sur le projet et j'aime bien d Execution dynamique [ par alichem8 ] slt , j'ai fait un programme qui sert à verifier le langage d'un automate.J'ai voulu généraliser mon programme pour qu'il reconaisse  n'imprte quel au Deux chaînes à parser [ par corole3 ] Bonjour,je récupère dans deux fichiers les infos sur les process et services en cours. Je voudrais parser les données du premier fichier qui se présen taille mémoire d'un tableau dynamique de string [ par ni69 ] Bonjour,Est-il possible de connaître exactement la taille mémoire occupée par un tableau dynamique de string ?J'ai cherché un bon moment sans rien tro Clé Composée !! [ par tmsarts ] Salut à tousJe travail sur un projet de Budget, et je veut facilité la saisi du code d'opération.Sachant que j'ai :- Une base de donnée "Secteur" avec compilation de code généré [ par zininf ] bonjour, ma question est la suivante : comment compiler un code généré pendant l'execution pour qu'il sera executé ? je précise : dans une petite appl


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,234 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.