begin process at 2012 02 11 02:57:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Système

 > 

Mémoire

 > 

GetMem et compagnie


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

GetMem et compagnie

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ée dans : code, mémoire, fonctions, compagnie, getmem


Répondre à ce message

Sujets en rapport avec ce message

mémoire locale et mémoire globale [ par Gerard ] Bonjour, J'ai entrepris la refonte de mon serveur - qui marche par ailleurs très bien - une centaine de joueurs (de bridge) par jour dans l'objectif s Editeur 3d avec du opengl [ par pestiferer ] Bonjours! Voici donc, une liste de fonction qui se situe dans mon fichier de base. [code]uses Windows, Messages, SysUtils, Classes, Graphics, Contr incrémentation du code [ par rafikjka ] salut j'ai une base de donneés dont la forme est la suivante : code client nom prenom adresse profession je voulais faire attribuer la valeur 30 appeller l'evenement d'un autre composant [ par MohInfo ] bonsoir à tous j'ai un petit soucis je veux implémenter dans un TmenuItem le méme code que celui d'un tButton qui se situe dans une autre form, comm [CS]Comment ajouter un nouveau code-source : truc bizarre [ par pseudo3 ] Bonjour, Petite question : On fait comment pour ajouter un nouveau code-source car je viens d'essayer et arrivé à "Etape 3 : Faciliter le referenceme recherche dans le registre [ par casper150 ] bonjour, je cherche le moyen de récupère une string dans le registre mais sans connaitre la clé je vous montre en code [code=pas]Var Registre : TRe Remplacer un caractère par un autre [ par gpletinckx ] Bonjour, Je voudrais que lors de la frappe du caractère apostrophe ou du caractère point-virgule, ceux-ci soient remplacés par un espace. J'ai réalis Effacer la dernière image dessinée [ par Jean_Jean ] Bonjour à tous, Non je ne programme pas sur la plage mais au milieu de mes cartons! Mais si comme je le pense vous avez emmené votre pc sur la plage


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,820 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales