Précédent   Forum des professionnels en informatique > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 08/03/2006, 11h35   #1
Membre Expert
 
Avatar de Gruik
 
Développeur Web
Inscription : juillet 2003
Messages : 1 546
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 1 546
Points : 1 459
Points : 1 459
Par défaut GCC - A propos de la pile

Salut,

Je me demandais comment on faisait pour savoir combien de taille de pile alloue gcc à un programme. Est-ce une taille fixe (et parametrable) ou bien il la determine tout seul en fonction des variables locales qu'il trouve?

Je crois savoir que les variables locales sans classe de mémorisation sont dites "automatiques" et d'apres moi, elles sont mises en "static" si le compilateur estime que yaura pas assez de place pour une telle variable dans la pile. Mais en fait j'en sais rien.

Est il possible de savoir ce que le compilateur fait des grosses variables locales? Car je crois qu'une taille typique de pile est de l'ordre de 2Ko, un buffer de 10Ko ne rentrerait pas.

Je cherche juste à faire des economies de memoire dans le segment de données et donc ces temps ci je privilegie la pile (buffers non static donc).
Gruik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 12h30   #2
Rédacteur
 
Avatar de Emmanuel Delahaye
 
Inscription : décembre 2003
Messages : 14 502
Détails du profil
Informations personnelles :
Âge : 55
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2003
Messages : 14 502
Points : 18 101
Points : 18 101
Par défaut Re: GCC - A propos de la pile

Citation:
Envoyé par Gruik
Je me demandais comment on faisait pour savoir combien de taille de pile alloue gcc à un programme.
Il n'y a pas de réponse portable, et c'est un vrai problème.
Citation:
Est-ce une taille fixe (et parametrable) ou bien il la determine tout seul en fonction des variables locales qu'il trouve?
Ca déoend de l'implémentation. C'est souvent automatique, c'est à dire que la mémoire libre (le tas) est attaqué d'un coté par la pile et de l'autre par les malloc(). Il peut on non y avoir un contrôle... Ne pas compter dessus. Il peut aussi y avoir une pile par thread, par processus, par interruption... C'est très complexe et hors de la portée du programmeur C.
Citation:
Je crois savoir que les variables locales sans classe de mémorisation sont dites "automatiques" et d'apres moi, elles sont mises en "static"
Euh non.
'auto' -> mémoire automatique (pile)
'static' -> mémoire statique
Citation:
si le compilateur estime que yaura pas assez de place pour une telle variable dans la pile. Mais en fait j'en sais rien.
Ben non. Ca interdirait la récursion, les appels imbriquées, le multi-threads...
Citation:
Est il possible de savoir ce que le compilateur fait des grosses variables locales?
local = auto. Si ça casse, c'est de la faute du programmeur. La mémoire allouée est là pour ça.
Citation:
Car je crois qu'une taille typique de pile est de l'ordre de 2Ko, un buffer de 10Ko ne rentrerait pas.
Il n'y a pas de 'taille typique'. Ca peut aller de quelques bytes à plusieurs méga...
Citation:
Je cherche juste à faire des economies de memoire dans le segment de données et donc ces temps ci je privilegie la pile (buffers non static donc).
Mauvaise idée. malloc()/free() sont tes amis dès qu'un objet local dépasse une 100aine de bytes (au pif).
__________________
Pas de Wi-Fi à la maison : CPL

Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://www.bien-programmer.fr/
http://bien-programmer.forum-actif.net/forum.htm
Emmanuel Delahaye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 14h17   #3
Membre Expert
 
Avatar de Gruik
 
Développeur Web
Inscription : juillet 2003
Messages : 1 546
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 1 546
Points : 1 459
Points : 1 459
Merci pour ces eclaircissements.

Ce thread pourrait partir en debat "pour ou contre malloc" car je suis assez anti-malloc. Mais si tu dis que mettre de trop gros objets dans la pile engendre des especes d'allocations dynamiques, ça redore effectivement le blason du malloc.

Pourquoi je suis anti malloc
* C'est vraiment source de problèmes. Un free qu'on fait 2 fois, une lecture ou ecriture apres un free, un free qu'on oblie...
* S'amuser à tester le retour du malloc avec NULL rajoute de la complexité et allourdit le code. A t on vraiment envie de prevoir quelquechose si malloc echoue? Qui dans la salle a deja eu un malloc retournant NULL?
* On peut pas utiliser sizeof() pour connaitre la taille du tableau de caracteres alloué. J'utilise beaucoup sizeof() dans les snprintf, strncpy et fgets. (ca s'applique bien sur qu'aux tableaux de caracteres pour y mettre du texte, apres pour les objets, on peut toujours utiliser sizeof)
Gruik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 14h40   #4
Rédacteur/Modérateur
 
Avatar de fearyourself
 
Homme
Ingénieur Informaticien Senior
Inscription : décembre 2005
Messages : 4 921
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur Informaticien Senior
Secteur : Industrie

Informations forums :
Inscription : décembre 2005
Messages : 4 921
Points : 8 098
Points : 8 098
Citation:
Envoyé par Gruik
Pourquoi je suis anti malloc
* C'est vraiment source de problèmes. Un free qu'on fait 2 fois, une lecture ou ecriture apres un free, un free qu'on oblie...
Si on code correctement, ces problèmes n'en sont pas (remarque, si on met les pointeurs à NULL après un free, il n'y a plus de problème pour le double free). Et la lecture et écriture peuvent vérifier si le pointeur est encore valide (par rapport à NULL)...

Comme l'écrirait Emmanuel:

Code :
1
2
 
free(ptr) , ptr = NULL;
Citation:
* S'amuser à tester le retour du malloc avec NULL rajoute de la complexité et allourdit le code. A t on vraiment envie de prevoir quelquechose si malloc echoue? Qui dans la salle a deja eu un malloc retournant NULL?
Moi, plus d'une fois... Travaille avec des grandes quantités de données et tu remarqueras que cela arrive fréquemment.

Citation:
* On peut pas utiliser sizeof() pour connaitre la taille du tableau de caracteres alloué. J'utilise beaucoup sizeof() dans les snprintf, strncpy et fgets. (ca s'applique bien sur qu'aux tableaux de caracteres pour y mettre du texte, apres pour les objets, on peut toujours utiliser sizeof)
Je passe généralement une structure contenant la taille du tableau. En statique, j'utilise aussi un entier pour avoir la taille "effective" (vs les cases vides) donc de toute façon j'ai un entier...

Jc
fearyourself est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 14h50   #5
Rédacteur
 
Avatar de Franck.H
 
Franck HECHT
Inscription : janvier 2004
Messages : 5 573
Détails du profil
Informations personnelles :
Nom : Franck HECHT
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 5 573
Points : 6 981
Points : 6 981
Envoyer un message via MSN à Franck.H
Citation:
Envoyé par Gruik
Ce thread pourrait partir en debat "pour ou contre malloc" car je suis assez anti-malloc.
Il n'y a pas à être contre ou pour malloc, c'est des fonctions plus qu'essentielle du C, d'ailleurs, je ne pense pas qu'on puisse s'en passer, j'ai du mal à m'en rendre compte qu'on puisse programmer en C sans jamais utiliser malloc ou autre fonction de la meme famille

Franchement, s'il y'a bien un truc à maïtriser, c'est bien l'allocation dynamique et ce va de soi .... les pointeurs !
__________________
Mon Site
Groupe social des amateurs du langage C
Ma bibliothèque de gestion de chaînes de caractères : CStr


"L'imagination est plus importante que le savoir" A. Einstein
Franck.H est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 14h52   #6
Rédacteur
 
Avatar de Emmanuel Delahaye
 
Inscription : décembre 2003
Messages : 14 502
Détails du profil
Informations personnelles :
Âge : 55
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2003
Messages : 14 502
Points : 18 101
Points : 18 101
Citation:
Envoyé par Gruik
Ce thread pourrait partir en debat "pour ou contre malloc"
Je ne vois pas quels sont les arguments contre malloc(). On ne peut quasiment pas faire de programmation sérieuse, souple, auto-démerdante sans malloc(). Personnellement, c'est plutôt la mémoire statique que j'aurais tendance à éliminer.
Citation:
car je suis assez anti-malloc. Mais si tu dis que mettre de trop gros objets dans la pile engendre des especes d'allocations dynamiques,
Non, des catastrophes !
Citation:
ça redore effectivement le blason du malloc.

Pourquoi je suis anti malloc
* C'est vraiment source de problèmes. Un free qu'on fait 2 fois, une lecture ou ecriture apres un free, un free qu'on oblie...
Ca, c'est le B.A. BA. Si tu n'aimes pas malloc(), faut pas faire de C... Mais la gestion demande de la rigueur, et comme je ne suis pas un génie, je me suis fait un outil de vérification :

http://emmanuel-delahaye.developpez.com/clib.htm
Module SYSALLOC

qui est à la disposition de la communauté.
Citation:
* S'amuser à tester le retour du malloc avec NULL rajoute de la complexité et allourdit le code. A t on vraiment envie de prevoir quelquechose si malloc echoue? Qui dans la salle a deja eu un malloc retournant NULL?
On voit que tu n'as jamais traité de gros blocs de données (plusieurs Mo), ni fait d'embarqué avec 128 ko de RAM...
Citation:

* On peut pas utiliser sizeof() pour connaitre la taille du tableau de caracteres alloué.
Une structure {taille,adresse} fait l'affaire.
Citation:
J'utilise beaucoup sizeof() dans les snprintf, strncpy et fgets. (ca s'applique bien sur qu'aux tableaux de caracteres pour y mettre du texte, apres pour les objets, on peut toujours utiliser sizeof)
Si tu es un adepte des tableaux de taille fixe, je comprends que tu aimes sizeof, mais dans la vrai vie, les tableaux fixes, c'est rare. Oui, il faut mémoriser et transporter adresse et taille. Rien de bien nouveau...

Pour te faire aimer malloc() :

http://emmanuel-delahaye.developpez.com/clib.htm
__________________
Pas de Wi-Fi à la maison : CPL

Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://www.bien-programmer.fr/
http://bien-programmer.forum-actif.net/forum.htm
Emmanuel Delahaye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 15h04   #7
Membre Expert
 
Avatar de Gruik
 
Développeur Web
Inscription : juillet 2003
Messages : 1 546
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 1 546
Points : 1 459
Points : 1 459
( haha, comment ils sont furieux )

Hey, je dis pas qu'on peut se passer de malloc, je voulais dire que c'est pas parce qu'on sait faire de l'allocation dynamique qu'il faut l'utiliser à chaque fois.
J'ai été adepte du malloc, mais aujourd'hui je sais que le code le plus simple est le mieux.
Gruik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 15h13   #8
Rédacteur
 
Avatar de Emmanuel Delahaye
 
Inscription : décembre 2003
Messages : 14 502
Détails du profil
Informations personnelles :
Âge : 55
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2003
Messages : 14 502
Points : 18 101
Points : 18 101
Citation:
Envoyé par Gruik
Hey, je dis pas qu'on peut se passer de malloc, je voulais dire que c'est pas parce qu'on sait faire de l'allocation dynamique qu'il faut l'utiliser à chaque fois.
J'ai été adepte du malloc, mais aujourd'hui je sais que le code le plus simple est le mieux.
Je suis d'accord.
__________________
Pas de Wi-Fi à la maison : CPL

Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://www.bien-programmer.fr/
http://bien-programmer.forum-actif.net/forum.htm
Emmanuel Delahaye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 16h01   #9
Membre Expert
 
Avatar de Gruik
 
Développeur Web
Inscription : juillet 2003
Messages : 1 546
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 1 546
Points : 1 459
Points : 1 459
^^

Bon j'ai posé la question sur la mailing list gcc ..
Si j'ai pensé que la pile était limitée en taille c'est parce que du temps de ma jeunesse ou j'utilisais borland c++, on pouvait choisir la "taille" de son executable et configurer je crois la taille de la pile
Et aussi, j'avais fait un peu d'assembleur (x86) et je me souviens qu'on pouvait definir la aussi les differentes tailles des segments et de la pile.
Gruik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2006, 16h27   #10
Expert Confirmé Sénior
 
Avatar de Médinoc
 
Homme
Développeur informatique
Inscription : septembre 2005
Messages : 21 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

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

Informations forums :
Inscription : septembre 2005
Messages : 21 338
Points : 28 440
Points : 28 440
Envoyer un message via MSN à Médinoc
La pile est bel et bien limitée en taille.

Sous Windows par exemple, on spécifie la taille lors d'un CreateThread(), (ou à l'édition de lien pour le premier thread) et la taille par défaut fait 1 Mo.
Si on dépasse, on a droit à l'exception EXCEPTION_STACK_OVERFLOW (ce n'est pas une exception C++)
Médinoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 09h43   #11
Membre Expert
 
Avatar de Gruik
 
Développeur Web
Inscription : juillet 2003
Messages : 1 546
Détails du profil
Informations personnelles :
Âge : 28

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 1 546
Points : 1 459
Points : 1 459
Ok, merci, c'est ce qu'on m'a repondu aussi sur la mailing list.

La commande linux "limit" donne la taille de la pile pour tout programme et elle était de 8Mo pour moi.
Gruik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 13h10   #12
Expert Confirmé Sénior
 
Homme Mathias Gaunard
Ingénieur développement logiciels
Inscription : décembre 2003
Messages : 3 535
Détails du profil
Informations personnelles :
Nom : Homme Mathias Gaunard
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : décembre 2003
Messages : 3 535
Points : 4 404
Points : 4 404
Citation:
et comme je ne suis pas un génie, je me suis fait un outil de vérification :
autant utiliser valgrind.
__________________
Boost ftw
loufoque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 13h27   #13
Rédacteur
 
Avatar de Emmanuel Delahaye
 
Inscription : décembre 2003
Messages : 14 502
Détails du profil
Informations personnelles :
Âge : 55
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2003
Messages : 14 502
Points : 18 101
Points : 18 101
Citation:
Envoyé par loufoque
Citation:
et comme je ne suis pas un génie, je me suis fait un outil de vérification :
autant utiliser valgrind.
C'est portable ? On a le code source ? Ca marche sur des petites plateformes (embarqué) ? C'est indépendant de la lib c ?
__________________
Pas de Wi-Fi à la maison : CPL

Des infos sur la programmation et le langage C:
http://bien-programmer.blogspot.com/
http://www.bien-programmer.fr/
http://bien-programmer.forum-actif.net/forum.htm
Emmanuel Delahaye est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 17h46   #14
Expert Confirmé Sénior
 
Homme Mathias Gaunard
Ingénieur développement logiciels
Inscription : décembre 2003
Messages : 3 535
Détails du profil
Informations personnelles :
Nom : Homme Mathias Gaunard
Localisation : France, Gironde (Aquitaine)

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

Informations forums :
Inscription : décembre 2003
Messages : 3 535
Points : 4 404
Points : 4 404
Ça marche uniquement sous linux x86, x86_64 et ppc.
Ça travaille directement avec les binaires, c'est indépendant du langage de programmation, donc a priori aussi de la libc.
Et c'est sous GPL.

Valgrind est une suite complète de qualité pour déboguer et profiler des programmes sous linux.

Si le programme n'a pas trop de code qui dépend de la plateforme, déboguer sous linux suffit.
__________________
Boost ftw
loufoque est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2006, 17h51   #15
Rédacteur
 
Avatar de Franck.H
 
Franck HECHT
Inscription : janvier 2004
Messages : 5 573
Détails du profil
Informations personnelles :
Nom : Franck HECHT
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 5 573
Points : 6 981
Points : 6 981
Envoyer un message via MSN à Franck.H
Oui mais là ca reste surtout uniquement pour Linux, ce qui n'est pas top, pour ce genre de d'outils le must reste quand même la possibilité de portabilité !
__________________
Mon Site
Groupe social des amateurs du langage C
Ma bibliothèque de gestion de chaînes de caractères : CStr


"L'imagination est plus importante que le savoir" A. Einstein
Franck.H est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 23h57.


 
 
 
 
Partenaires

Hébergement Web