[C++] Variables globales non initialisées ?

Variables globales non initialisées ? [C++] - C++ - Programmation

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 :

  • les variables non initialisées, ou les variables initialisées à 0, qui seront stockées dans la partie .bss du programme, et seront initialisées à 0 avant l'appel du main()
  • les variables initialisées à une valeur différente de 0, qui seront stockées accompagnées de leur valeur d'origine dans la partie .data du programme.


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 :)

Reply

Marsh Posté le 05-05-2008 à 16:46:02   

Reply

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
char global[1 << 20] = "";

 

[ltmp]$ g++ -c data.cpp && size data.o && ls -lh data.o
   text    data     bss     dec     hex filename
      0 1048576       0 1048576  100000 data.o
-rw-r--r--  1 luser group 1,1M mai  5 17:32 data.o


vs.

[tmp]$ cat data.cpp
char global[1 << 20];

 

[tmp]$ g++ -c data.cpp && size data.o && ls -lh data.o
   text    data     bss     dec     hex filename
      0       0 1048576 1048576  100000 data.o
-rw-r--r--  1 luser group 969 mai  5 17:32 data.o


Message édité par Taz le 05-05-2008 à 17:34:18
Reply

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.

Reply

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.

Reply

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.

Reply

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-05-2008 à 12:58:25    

Sous Windows le contenu de .bss est souvent ajouté à la fin de .data.


---------------
dap.developpez.com
Reply

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.

Reply

Marsh Posté le 11-05-2008 à 08:46:34    

Avec VS c'est vrai en release mais pas en debug.

Reply

Marsh Posté le 11-05-2008 à 11:08:23    

De toute façon, sous windows, j'ai longtemps utilisé les compilos Metaware, alors... :D
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-05-2008 à 11:08:23   

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed