Créer des tableaux de données de manière dynamique

Soyez le premier à donner votre avis sur cette source.

Vue 3 691 fois - Téléchargée 656 fois

Description

Le source est composé de plusieurs fonctions (utilisables par inclusion du fichier).
Il est assez prétentieux puisque il veut simplifier le problème.
Un exemple,des plus simples,est fourni et le source est abondamment commenté.

Conclusion :


Ne risquer plus les memory leak,utiliser la mémoire de manière dynamique,c'est plus simple.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
Pour les allocations locales, il faut des petits blocs car sinon la fonction est obligée de passer par une allocation globale.

L'allocation globale est plus lente car elle doit faire appel au système plutôt que de rester dans son processus.

Je s
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
Il faudrait être un idiot pour croire que réalloc puisse toujours avoir le même pointeur. Cependant, il y aurait des solutions intermediaires: allouer une zone virtuelle plus grosse et allouer physiquement par petit morceaux à la demande. C'est ce que je t'ai expliqué plus haut mais tu as crié à l'impossibilité, or, ce que tu ne sais pas faire n'est pas forcement impossible.

Deuxièmement, le changement de pointeur est embêtant dans quels cas: Quand le pointeur est partagé par plusieurs fonctions ou threads. Il serait possible de faire les fonctions AllocForRealloc et Realloc2 qui contiendraient la gestion de la memoire virtuelle en plus.

Donc oui, je serais capable de la programmer et non, je ne l'ai pas encore fait. Cela ne veut pas dire que c'est impossible mais juste que je n'en ai pas eut encore besoin.

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
mmap.realloc:;(MMAP*,*,CB):CF&EAX=SIZE,!CF
LBEG
mov ebx,__parm(1)
mov eax,__parm(2)
xor edx,edx
mov esi,[ebx+MMAP.pdir]
mov ecx,[ebx+MMAP.cdir]
call mmap.getnode
jb .5
mov edx,[esi+ecx*8+4]
lea edi,[esi+ecx*8+4]
.1; tant que ccb < cbreq
cmp edx,__parm(3)
mov eax,__parm(2)
jb .3
je .4
.2;recherche du bloc suivant
mov esi,[ebx+MMAP.pdir]
add eax,edx
mov ecx,[ebx+MMAP.cdir]
call mmap.getnode
jb .5
.21;allocation du bloc suivant
btr pd[esi+ecx*8+4],BLOCLOCK
jnb .5
.22;liberation du bloc suivant
add edx,[esi+ecx*8+4]
mov pd[esi+ecx*8],0
mov pd[esi+ecx*8+4],2
jmp .1
.3;coupe le bloc.
mov eax,__parm(3)
sub edx,__parm(3)
add eax,__parm(2)
call mmap.allocnode
mov eax,edx
mov edx,__parm(3)
jnb .4
add edx,eax
.4;met a jour la node.
mov [edi],edx
mov __eax,edx
clc
LEND
ret
.5
mov __eax,edx
stc
LEND
ret

Cette fonction réalloc ne change jamais le pointeur, elle préfère ressortir en echec. A l'utilisateur de réallouer une autre zone et de copier la précedente. J'aurais pu automatiser mais je n'ai jamais utilisé ni même testé cette fonction. Par contre, on y pense pas forcement mais un réalloc d'une zone plus petite libèrera la partie en trop.

Vu que ça semblait te tenir à coeur de la voir, la voilà...
Messages postés
570
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
18 janvier 2021
2
Je n'ai pas trop le temps de "cogiter" là desus et HeapReAlloc me va bien.Merci quand même.
Ce qui peut être fait,si la chose t'interesse,ce sont des tests de rapidité sur le même type de fonctions que HeapReAlloc.Avec la heap ,avec globalrealloc..
Globalrealloc est donné plus rapide sur de gros blocs de mémoire et Heaprealloc plus rapide sur de petits blocs de mémoires,reste a savoir dans quels conditions et à vérifier l'assertion.
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
Si tu avais regardé le source, tu aurais vu que le code n'est plus mis à jour. Ma version est ok. Pour finir, ce n'est pas une question de mieux ou de moins bien, mais de choix...

Si tu nous exposais les tiens, il y aurait peut-être matière à cogiter...
Afficher les 20 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.