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 :

gcc: allocation mémoire plus que bizarre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Par défaut gcc: allocation mémoire plus que bizarre
    Bonjour,
    ceci est mon premier post ! je suis débutant en C, et je rencontre un problème totalement absurde que je n'arrive pas à m'expliquer.
    Je suis sous Linux (ordinateur Intel Pentium, normal quoi) et j'utilise gcc pour la compil

    Voilà mon programme. Je déclare dans une fonction deux tableaux de caractères, de 3 et 5 caractères par exemple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void fonction(int a, int b, int c) {
       char tab1[3];
       char tab2[5];
    }
     
    int main() {
     fonction(1,2,3);
    }
    Le tableau de 3 caractères (=3octets) va prendre 1 mot double (4 octets) en mémoire, tandis que le tableau de 5 va en prendre 2, puisqu'on arrondit toute allocation à un multiple de 32 bits (ou je me trompe ?)

    j'ai pourtant une grosse surprise. pour vérifier ce que je viens de dire, je compile sans assembler:
    # gcc -S -o exemple.s exemple.o
    et voilà à quoi ressemble ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fonction:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$40, %esp
    	leave
    	ret
    40 octets alloués dans la pile !!
    je rééssaie avec un seul tableau, de 4 caractères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fonction:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$4, %esp
    	leave
    	ret
    là, je suis d'accord.
    voyons voir avec un seul tableau de 3 caractères?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fonction:
    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$24, %esp
    	leave
    	ret

    Quel est le problème? Ça me laisse vraiment perplexe...

    Nass

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    gcc a tendance à faire des trucs un peu "personnels" sur la pile.
    Notamment pour certains appels de fonction, j'ai déjà vu gcc réserver à l'avance un gros buffer sur la pile et y mettre les paramètres, plutôt que les empiler au fur et à mesure...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Citation Envoyé par __NR_nass Voir le message
    puisqu'on arrondit toute allocation à un multiple de 32 bits (ou je me trompe ?)
    La taille totale de l'allocation doit être alignée par 4 donc on pourrait utiliser 8 octets pour les deux tableaux a priori. Réessaie en activant les optimisations pour être sûr que GCC fait du mieux qu'il peut. Il y a des fonctions optimisées comme strlen() qui traitent les octets quatre à quatre donc c'est peut-être intéressant que le dernier caractère soit aligné par 4 mais ça me paraît tiré par les cheveux...


    Citation Envoyé par Médinoc Voir le message
    gcc a tendance à faire des trucs un peu "personnels" sur la pile.
    Notamment pour certains appels de fonction, j'ai déjà vu gcc réserver à l'avance un gros buffer sur la pile et y mettre les paramètres, plutôt que les empiler au fur et à mesure...
    C'est inefficace sur les processeurs modernes d'ailleurs. Il alignait aussi la pile par 16 avant mais apparemment ça a changé.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Par défaut
    merci pour ces réponses
    Citation Envoyé par dapounet Voir le message
    Réessaie en activant les optimisations pour être sûr que GCC fait du mieux qu'il peut.
    comment? désolé, je suis plus dans l'assembleur pour l'instant (align 4)

    ce qui m'a amené à poster ça c'est que j'ai lu un article où deux tableaux de 5 et 10 caractères étaient réservés, et en conséquence on avait 20 octets alloués, comme on pouvait s'y attendre...

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par __NR_nass Voir le message
    comment? désolé, je suis plus dans l'assembleur pour l'instant (align 4)
    • gcc -O
    • gcc -O2
    • gcc -O3

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Par défaut
    merci...
    pas de changement de comportement cependant (même espace alloué).

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par dapounet Voir le message
    C'est inefficace sur les processeurs modernes d'ailleurs.
    Pourquoi ça?

  8. #8
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Parce que sur le Pentium M et le Core PUSH ne fait qu'une µop et que c'est plus court de passer les arguments normalement que d'adresser la pile indirectement. C'est la même chose pour le K10 :

    http://www.amd.com/us-en/assets/cont...docs/40546.pdf
    4.7 Stack Operations
    Optimization
    When saving or restoring registers in function prologues or epilogues, or when passing arguments through the stack, use PUSH or POP instructions to improve performance and to reduce code size.
    Sinon pour revenir au problème, ce serait possible que l'espace mémoire en plus soit là pour les vérifications de sécurité à l'exécution ?

Discussions similaires

  1. [BPW] [BP7] Problème d'allocation de plus de 64K de mémoire
    Par cafabien dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 01/07/2008, 16h27
  2. height: encore plus que 100%
    Par Anduriel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 23/06/2005, 13h56
  3. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  4. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59

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