IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Comment se "déplacer" dans la mémoire


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut Comment se "déplacer" dans la mémoire
    Bonjour!
    Je suis en train d'écrire les fonctions malloc() et free(). Pour optimiser le malloc je veux qu'il accède aux blocs déjà libérés (précédemment alloués). Alors est-ce que j'ai le droit d'écrire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tmp2=sbrk(power(size)+sizeof(t_block_descriptor)); //J'aloue la mémoire (tmp2 est un ponteur sur structure)
    tmp2->next=tmp2+(power(size)+sizeof(t_block_descriptor)); // Pour que le champ "next" ait l'adresse du prochain bloc disponible.
    return(tmp2);
    ?

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Pour répondre à la question dans ton titre, Pour se déplacer dans la mémoire, il faut que tu utilise un void *. Tu lui assigne une adresse, et ensuite tu avance dans ta mémoire avec en additionnant ou soustrayant des valeurs (ou des adresses).

    Sinon c'est quoi cette fonction power?

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    6-MarViN, on ne peut pas faire d'arithmétique sur un pointeur void *. Il faut un char * ou un type du même genre.

    Edit : Au temps pour moi, on peut tout à fait faire de l'arithmétique sur un void *. Si quelqu'un veut bien me voter - et voter + pour 6-MarViN.

  4. #4
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    malloc() et free() sont des appels système qui gère la mémoire. C'est donc l'os qui va s'occupé de tout. Malgrès cela si tu trouve que cela est mal fait par l'OS. Tu peux toi même gérer un allocateur de mémoire, ce qui plus ou moins simple.
    Le plus simple est de faire un gros malloc, puis après de toi même gère la mémoire, mais ceci peu être dangereux.

    Perso j'ai une application qui possède un magazin de buffer, et une classe image qui demande un buffer libre au magazin, et le libère lors de sa destruction.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    La fonction power est une fonctionn que j'ai codée et qui fait juste des calculs pour gérer les arrondis... mais peu importe. Elle renvoie juste un entier qui servira de taille.
    Je dois recoder le malloc() et le free() pour un TP.
    Quelqu'un peut-il me donner un exemple d'addition d'adresse?

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Citation Envoyé par matafan Voir le message
    6-MarViN, on ne peut pas faire d'arithmétique sur un pointeur void *. Il faut un char * ou un type du même genre.
    Si, en castant les void *. J'ai moi même eu a recoder malloc et free pour un projet scolaire et j'utilisait des void *.

    Sinon pour faire des addition d'adresse et d'entiers (pour par exemple avancer dans la mémoire), faire un truc du genre void * + int fonctionne, vu que le compilo va se demerder au niveau des casts implicites.

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Sinon pour faire des addition d'adresse et d'entiers (pour par exemple avancer dans la mémoire), faire un truc du genre void * + int fonctionne, vu que le compilo va se demerder au niveau des casts implicites.
    Alors si dans mon bloc j'ai une structure et de la mémoire en plus, si je veux accéder aux données de la structure je fais l'adresse du bloc moins la taille de la structure ou 'adresse du bloc plus la taille de la structure?

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Tout dépend.

    Si la structure précède la mémoire en plus, dans ce cas l'adresse de ton bloc sera aussi l'adresse de la structure. Si en revanche ta structure se trouve après la mémoire en plus, il faudra faire adresse_de_bloc + taille_de_mémoire_en_plus pour avoir l'adresse de ta structure.

    après une fois que tu a l'adresse de la structure, tu la cast en un pointeur sur le type de structure et tu accède normalement au élément de ta structure.

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Je ne suis pas sûr savoir où se trouve la structure par rapport à l'espace mais je pense que dans mon cas l'adresse de la structure est aussi l'adresse du block:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tmp2=sbrk(power(size)+sizeof(t_block_descriptor)); //J'aloue la mémoire (tmp2 est un ponteur sur structure)
    tmp2->next=tmp2+(power(size)+sizeof(t_block_descriptor)); // Pour que le champ "next" ait l'adresse du prochain bloc disponible.
    return(tmp2);
    Si c'est le cas, j'ai essayé le cast mais le compilo ne l'accepte pas. Je ne peux pas caster un void* en pointeur sur structure.

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Citation Envoyé par dré kam Voir le message
    Je ne suis pas sûr savoir où se trouve la structure par rapport à l'espace mais je pense que dans mon cas l'adresse de la structure est aussi l'adresse du block:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tmp2=sbrk(power(size)+sizeof(t_block_descriptor)); //J'aloue la mémoire (tmp2 est un ponteur sur structure)
    tmp2->next=tmp2+(power(size)+sizeof(t_block_descriptor)); // Pour que le champ "next" ait l'adresse du prochain bloc disponible.
    return(tmp2);
    Si c'est le cas, j'ai essayé le cast mais le compilo ne l'accepte pas. Je ne peux pas caster un void* en pointeur sur structure.
    Pour le cast, petite erreur de ma part. En fait pas besoin de cast tu peux directement faire structrure = void *.

    Apparemment ta structure a l'air d'être en effet en début de bloc. Sinon juste un conseil général. J'ai l'impression que tu fais appel a sbrk a chaque que tu dois allouer de la mémoire à une nouvelle variable. Ceci est ce qu'il y a de plus simple mais aussi ce qu'il y a de plus lourd. En effet faire un appel a sbrk correspond a modifier la position du break, ce qui est une action gourmande (comme la plupart des appels systèmes). Ce que je te conseille de faire (et c'est d'ailleurs ce que fait le vrai malloc), c'est de faire une grosse allocation au début, et ensuite subdiviser cet espace pour les différentes variables.(en gros de la manipulation d'adresse).

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Février 2011
    Messages : 247
    Points : 163
    Points
    163
    Par défaut
    Wow merci pour tout
    Par curiosité, qu'est-ce qu'il faudrait faire pour avoir la structure en fin de bloc?
    Et si comme tu dis j'alloue en début de programme un grand bloc,
    -est-ce qu'il y a un moyen de le "vérouiller" pour que l'utilisateur ne puisse pas écrire hors du bloc et empiéter sur le block suivant?
    -quelle doit être la taille de ce grand bloc?

  12. #12
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Envoyé par matafan
    6-MarViN, on ne peut pas faire d'arithmétique sur un pointeur void *. Il faut un char * ou un type du même genre.
    Si, en castant les void *. J'ai moi même eu a recoder malloc et free pour un projet scolaire et j'utilisait des void *.
    Si tu les transtypes, ce ne sont plus des void* !

    Sinon pour faire des addition d'adresse et d'entiers (pour par exemple avancer dans la mémoire), faire un truc du genre void * + int fonctionne, vu que le compilo va se demerder au niveau des casts implicites.
    Et quel cast implicite peut être utilisé dans ce cas ?
    Où as-tu trouvé le comportement de l'arithmétique sur un pointeur sur void ?

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo