Variables globales non initialisées ? [C++] - C++ - Programmation
Marsh Posté le 05-05-2008 à 17:33:27
pour les globales si c'est imposé.
L'emplacement .data ou .bss, c'est historique: le .bss map sur de la mémoire initialisée à 0 au chargement du programme, donc ça prend pas de place au niveau du binaire. Alors qu'en .data, tu as à la définition des données
[tmp]$ cat data.cpp [ltmp]$ g++ -c data.cpp && size data.o && ls -lh data.o |
vs.
[tmp]$ cat data.cpp [tmp]$ g++ -c data.cpp && size data.o && ls -lh data.o |
Marsh Posté le 05-05-2008 à 17:39:57
Ok merci
Je suppose donc que la partie qui met à 0 la section .bss est considérée comme à la fois suffisamment petite en taille de code, et en temps d'exécution au démarrage du programme.
Marsh Posté le 06-05-2008 à 00:08:30
ça ne fait pas de vrai différence au niveau du temps de démarrage bss et data. ça a été fait pour la taille du binaire c'est tout. Il n'y a pas vraiment à y réfléchir. Pas la peine d'initialiser quelque chose à 0 si c'est déjà le cas implicitement.
Marsh Posté le 10-05-2008 à 10:31:08
juste pour savoir, si tu refais la même chose avec un gcc -O3, tu obtient les mêmes résultats ? Parce que ton tableau de caractères initialisé à "", il a toutes les chances de ne contenir que des zeros.
Ca m'emmerderais qu'écrire :
static int n = 0;
soit moins optimisé que :
static int n;
même si ça revient au même, car le 1er est plus lisible, surtout pour ceux qui ne connaissent pas la règle des static initilisées à zero.
Marsh Posté le 10-05-2008 à 12:43:27
Tiens ca me rappelle une anecdote: Sur DEC Station, le compilo C (meme pas ++) initialisait certains types de variable pas initialisée au moment de la déclaration (a 0 pour les types numériques, NULL pour les pointeurs, ...) même si elles n'étaient pas déclarées statiques.
Ca évitait certains plantages certes, mais le jour ou le code était porté sur une station SUN, bonjour les dégats.
A+,
Marsh Posté le 10-05-2008 à 12:58:25
Sous Windows le contenu de .bss est souvent ajouté à la fin de .data.
Marsh Posté le 10-05-2008 à 20:21:23
gilou : Windows noyau NT (donc NT4, 2000, Xp...) fait pareil, mais à l'exécution (il floode la pile et le heap avec des zeros avant qu'ils soient utilisés).
Alors au retour sous Win98, même problème.
Marsh Posté le 11-05-2008 à 08:46:34
ReplyMarsh Posté le 11-05-2008 à 11:08:23
De toute façon, sous windows, j'ai longtemps utilisé les compilos Metaware, alors...
A+,
Marsh Posté le 11-05-2008 à 12:08:25
cricri_ a écrit : Avec VS c'est vrai en release mais pas en debug. |
oui (et encore heureux...), l'OS remplit avec des 0 et VS flood avec des 0xCC par dessus en debug.
En release il ne fait rien (et c'est normal), c'est l'OS noyau NT qui remplit avec des 0.
Marsh Posté le 05-05-2008 à 16:46:02
Bonjour,
d'après quelques pages lues sur le web, il semblerait que les variables globales en C/C++ se décomposent en deux catégories :
D'abord j'aimerais savoir si ce comportement est le même pour tous les compilateurs C/C++ ?
Ensuite est-il possible d'avoir un comportement différent qui consisterait à mettre les variables initialisées (même à 0) dans .data, et les autres dans .bss, permettant ainsi de zapper la partie qui met à 0 la partie .bss ?
En effet il me semble avoir lu que la norme C/C++ n'impose pas au compilateur d'initialiser à 0 les variables (globales ou non) qui ne le sont pas par le programmeur.
J'espère avoir été suffisamment clair. Ma question est plus sur la compréhension du langage / des compilateurs que pratique pour l'instant.
Merci d'avance