GetMem et compagnie

florenth
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
- 2 juil. 2008 à 22:02
florenth
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
- 4 juil. 2008 à 11:13
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:
<li>GetMem</li><li>GlobalAlloc</li><li>VirtualAlloc
</li><li>HeapAlloc</li>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
http://www.mx-dev.net

7 réponses

f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
3 juil. 2008 à 04:08
[virtualallocex.htm VirtualAllocEx] function.







[heap_functions.htm 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.

<hr size="2" width="100%" />
0
florenth
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
3 juil. 2008 à 11:57
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.nethttp://te%3C/body
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
3 juil. 2008 à 17:30
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).

<hr size="2" width="100%" />
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
3 juil. 2008 à 17:35
sinon d'aprés ce que j'ai pus voir dans les sources delphi (system) GetMem semble utiliser VirtualAlloc.

<hr size="2" width="100%" />
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
3 juil. 2008 à 19:08
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.nethttp://te%3C/body
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
4 juil. 2008 à 02:45
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.

<hr size="2" width="100%" />
0
florenth
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
4 juil. 2008 à 11:13
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.nethttp://te%3C/body
0