begin process at 2008 08 29 21:29:54
1 233 885 membres
407 nouveaux aujourd'hui
14 294 membres club

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)

GetMem et compagnie le 02/07/2008 22:02:22

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 ]

Re : GetMem et compagnie le 03/07/2008 04:08:02

f0xi
Membre Club
(Admin CS)

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.






Re : GetMem et compagnie le 03/07/2008 11:57:31

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 ]

Re : GetMem et compagnie le 03/07/2008 17:30:57

f0xi
Membre Club
(Admin CS)

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).





Re : GetMem et compagnie le 03/07/2008 17:35:41

f0xi
Membre Club
(Admin CS)

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





Re : GetMem et compagnie le 03/07/2008 19:08:13

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 ]

Re : GetMem et compagnie le 04/07/2008 02:45:22

f0xi
Membre Club
(Admin CS)

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.




Re : GetMem et compagnie le 04/07/2008 11:13:22

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 ]


Classé sous : code, mémoire, fonctions, compagnie, getmem

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS