Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
Bonjour.
Je me trouve à nouveau en face d'un bout de code qui à un comportemen t
qui me surprend.
#include <stdio.h>
int tab[1000] = {0};
int main(void)
{
int i;
for(i = 0; i < 1000; i++)
printf("%dn", tab[i]);
return 0;
}
ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
problèmes.
Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
Bonjour.
Je me trouve à nouveau en face d'un bout de code qui à un comportemen t
qui me surprend.
#include <stdio.h>
int tab[1000] = {0};
int main(void)
{
int i;
for(i = 0; i < 1000; i++)
printf("%dn", tab[i]);
return 0;
}
ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
problèmes.
Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
Bonjour.
Je me trouve à nouveau en face d'un bout de code qui à un comportemen t
qui me surprend.
#include <stdio.h>
int tab[1000] = {0};
int main(void)
{
int i;
for(i = 0; i < 1000; i++)
printf("%dn", tab[i]);
return 0;
}
ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
problèmes.
Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
Je me trouve à nouveau en face d'un bout de code qui à un comportement
qui me surprend.
int tab[1000] = {0};
ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
problèmes.
Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
en espérant avoir été suffisamment clair (pas évident)
Je me trouve à nouveau en face d'un bout de code qui à un comportement
qui me surprend.
int tab[1000] = {0};
ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
problèmes.
Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
en espérant avoir été suffisamment clair (pas évident)
Je me trouve à nouveau en face d'un bout de code qui à un comportement
qui me surprend.
int tab[1000] = {0};
ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
problèmes.
Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
j'augmente la taille du tableau!
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
Ce qui me surprend c'est que si on se contente de la définition
globale
int tab[1000];
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
en espérant avoir été suffisamment clair (pas évident)
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
(donc sans initialisation explicite), la taille de l'exécutable ne
bouge pas.
j'avais compris qu'en globale ou en statique, les définitions
suivantes étaient équivalentes.
int tab[1000] = {0};
int tab[1000];
Il semble que je me trompe.
GurneyH écrivit :
> Je me trouve à nouveau en face d'un bout de code qui à un comportem ent
> qui me surprend.
OEQLC? Je n'ai pas vu dans le reste de ton message de bout de code dont
le comportement te surprennes, mais plutôt un problème de format
binaire. Pourrais-tu m'expliquer ce que je n'ai pas compris ?
> int tab[1000] = {0};
[...]
> ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
> problèmes.
> Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
> j'augmente la taille du tableau!
Mais où est le problème du code ?
[ Citation réordonnée ]
> j'avais compris qu'en globale ou en statique, les définitions
> suivantes étaient équivalentes.
> int tab[1000] = {0};
> int tab[1000];
> Il semble que je me trompe.
Non, tu ne trompes pas. « Équivalente » ne signifie pas « identiq ue ».
Et moi je ne vois pas où le comportement du programme diffère.
> Ce qui me surprend c'est que si on se contente de la définition
> globale
> int tab[1000];
> (donc sans initialisation explicite), la taille de l'exécutable ne
> bouge pas.
Hmm. Que dit size ? Que dis nm sur le symbole taille (est-il B ou D) ?
> en espérant avoir été suffisamment clair (pas évident)
Oh, le problème est limpide, mais dépend complètement du format de
fichier binaire (Mach-O) utilisé par ta plateforme, et par conséquent
des outils utilisés (en particulier l'éditeur de liens).
D'abord, et c'est indépendant de Mach-O, il faut voir que la déclarat ion
int tab[1000];
est spéciale avec *nix: au lieu de définir un tableau de 1000 entiers
comme tu pourrais le penser, elle déclare l'existence d'un tableau d'au
moins 1000 entiers. Cela veut dire que si dans un autre fichier tu as
int tab[2000];
le programme va se lier correctement (surprenant, non?) et va réserver
de la place pour 2000 entiers, mais ton premier programme va se
comporter comme s'il n'y en avait que 1000... Cela s'appelle un COMMON,
cela vient de Fortran et de la préhistoire de l'informatique.
Par contre, la déclaration
int tab[1000]={0};
n'est PAS un common, et surtout EST une définition, donc il est interdi t
d'avoir une autre initialisation dans un autre module (même si elle est
identique.) Le compilateur (le translateur, ici ccom) a le choix de dire
si l'objet est initialisé explicitement (.data et un millier de ".byte
0") ou implicitement (.bss + .space ou .lcomm, c'est pareil) : la
définition de l'interface binaire traditionnelle *nix dit que ce sera
équivalent (mais pas identique).
Évidemment, l'éditeur des liens est obligé de bosser derrière pou r
rassembler les morceaux ; cela l'amène à faire des « optimisations » au
passage, qui dans ton cas peuvent apparaître comme sous-optimales...
Donc, un éditeur de liens *nix est prié de transformer les "commons" en
sous-sections (normalement au sein de la section .bss, mais parfois cela
va ailleurs, comme avec Mach-O) et d'allouer les symboles en fonction de
leur plus grande taille. Aussi, l'éditeur des liens peut aussi
transformer une zone .data pleine de 0 en zone .bss, cela fait partie
des optimisations classiques d'un éditeur de liens. Mais il peut aussi
décréter que la zone .bss sera effectivement initialisée au sein du
fichier binaire : une raison habituelle pour faire cela est «
d'économiser » le code qui remplit de zéro la zone .bss, ou pour de s
modules qui vont en ROM et pour lesquels il est impossible d'initialiser
la mémoire avant de s´être assurer qu'elle existe effectivement...
Au final, je pense que c'est ce qui se passe dans ton cas, mais j'ignore
quelle est la raison qui pousse l'éditeur des liens d'Apple à forcer
l'incorporation de la section __bss dans le fichier a.out final :
je suppute que la liaison dynamique (qui est très spécifique) a quelq ue
chose à voir, mais je ne peux pas approfondir plus avec les information s
fournies.
Antoine
GurneyH écrivit :
> Je me trouve à nouveau en face d'un bout de code qui à un comportem ent
> qui me surprend.
OEQLC? Je n'ai pas vu dans le reste de ton message de bout de code dont
le comportement te surprennes, mais plutôt un problème de format
binaire. Pourrais-tu m'expliquer ce que je n'ai pas compris ?
> int tab[1000] = {0};
[...]
> ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
> problèmes.
> Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
> j'augmente la taille du tableau!
Mais où est le problème du code ?
[ Citation réordonnée ]
> j'avais compris qu'en globale ou en statique, les définitions
> suivantes étaient équivalentes.
> int tab[1000] = {0};
> int tab[1000];
> Il semble que je me trompe.
Non, tu ne trompes pas. « Équivalente » ne signifie pas « identiq ue ».
Et moi je ne vois pas où le comportement du programme diffère.
> Ce qui me surprend c'est que si on se contente de la définition
> globale
> int tab[1000];
> (donc sans initialisation explicite), la taille de l'exécutable ne
> bouge pas.
Hmm. Que dit size ? Que dis nm sur le symbole taille (est-il B ou D) ?
> en espérant avoir été suffisamment clair (pas évident)
Oh, le problème est limpide, mais dépend complètement du format de
fichier binaire (Mach-O) utilisé par ta plateforme, et par conséquent
des outils utilisés (en particulier l'éditeur de liens).
D'abord, et c'est indépendant de Mach-O, il faut voir que la déclarat ion
int tab[1000];
est spéciale avec *nix: au lieu de définir un tableau de 1000 entiers
comme tu pourrais le penser, elle déclare l'existence d'un tableau d'au
moins 1000 entiers. Cela veut dire que si dans un autre fichier tu as
int tab[2000];
le programme va se lier correctement (surprenant, non?) et va réserver
de la place pour 2000 entiers, mais ton premier programme va se
comporter comme s'il n'y en avait que 1000... Cela s'appelle un COMMON,
cela vient de Fortran et de la préhistoire de l'informatique.
Par contre, la déclaration
int tab[1000]={0};
n'est PAS un common, et surtout EST une définition, donc il est interdi t
d'avoir une autre initialisation dans un autre module (même si elle est
identique.) Le compilateur (le translateur, ici ccom) a le choix de dire
si l'objet est initialisé explicitement (.data et un millier de ".byte
0") ou implicitement (.bss + .space ou .lcomm, c'est pareil) : la
définition de l'interface binaire traditionnelle *nix dit que ce sera
équivalent (mais pas identique).
Évidemment, l'éditeur des liens est obligé de bosser derrière pou r
rassembler les morceaux ; cela l'amène à faire des « optimisations » au
passage, qui dans ton cas peuvent apparaître comme sous-optimales...
Donc, un éditeur de liens *nix est prié de transformer les "commons" en
sous-sections (normalement au sein de la section .bss, mais parfois cela
va ailleurs, comme avec Mach-O) et d'allouer les symboles en fonction de
leur plus grande taille. Aussi, l'éditeur des liens peut aussi
transformer une zone .data pleine de 0 en zone .bss, cela fait partie
des optimisations classiques d'un éditeur de liens. Mais il peut aussi
décréter que la zone .bss sera effectivement initialisée au sein du
fichier binaire : une raison habituelle pour faire cela est «
d'économiser » le code qui remplit de zéro la zone .bss, ou pour de s
modules qui vont en ROM et pour lesquels il est impossible d'initialiser
la mémoire avant de s´être assurer qu'elle existe effectivement...
Au final, je pense que c'est ce qui se passe dans ton cas, mais j'ignore
quelle est la raison qui pousse l'éditeur des liens d'Apple à forcer
l'incorporation de la section __bss dans le fichier a.out final :
je suppute que la liaison dynamique (qui est très spécifique) a quelq ue
chose à voir, mais je ne peux pas approfondir plus avec les information s
fournies.
Antoine
GurneyH écrivit :
> Je me trouve à nouveau en face d'un bout de code qui à un comportem ent
> qui me surprend.
OEQLC? Je n'ai pas vu dans le reste de ton message de bout de code dont
le comportement te surprennes, mais plutôt un problème de format
binaire. Pourrais-tu m'expliquer ce que je n'ai pas compris ?
> int tab[1000] = {0};
[...]
> ce code compilé sous Windows mingw, GCC sous Linux ne pose pas de
> problèmes.
> Mais sous MAC et compilé avec GCC la taille de l'exécutable gonfle si
> j'augmente la taille du tableau!
Mais où est le problème du code ?
[ Citation réordonnée ]
> j'avais compris qu'en globale ou en statique, les définitions
> suivantes étaient équivalentes.
> int tab[1000] = {0};
> int tab[1000];
> Il semble que je me trompe.
Non, tu ne trompes pas. « Équivalente » ne signifie pas « identiq ue ».
Et moi je ne vois pas où le comportement du programme diffère.
> Ce qui me surprend c'est que si on se contente de la définition
> globale
> int tab[1000];
> (donc sans initialisation explicite), la taille de l'exécutable ne
> bouge pas.
Hmm. Que dit size ? Que dis nm sur le symbole taille (est-il B ou D) ?
> en espérant avoir été suffisamment clair (pas évident)
Oh, le problème est limpide, mais dépend complètement du format de
fichier binaire (Mach-O) utilisé par ta plateforme, et par conséquent
des outils utilisés (en particulier l'éditeur de liens).
D'abord, et c'est indépendant de Mach-O, il faut voir que la déclarat ion
int tab[1000];
est spéciale avec *nix: au lieu de définir un tableau de 1000 entiers
comme tu pourrais le penser, elle déclare l'existence d'un tableau d'au
moins 1000 entiers. Cela veut dire que si dans un autre fichier tu as
int tab[2000];
le programme va se lier correctement (surprenant, non?) et va réserver
de la place pour 2000 entiers, mais ton premier programme va se
comporter comme s'il n'y en avait que 1000... Cela s'appelle un COMMON,
cela vient de Fortran et de la préhistoire de l'informatique.
Par contre, la déclaration
int tab[1000]={0};
n'est PAS un common, et surtout EST une définition, donc il est interdi t
d'avoir une autre initialisation dans un autre module (même si elle est
identique.) Le compilateur (le translateur, ici ccom) a le choix de dire
si l'objet est initialisé explicitement (.data et un millier de ".byte
0") ou implicitement (.bss + .space ou .lcomm, c'est pareil) : la
définition de l'interface binaire traditionnelle *nix dit que ce sera
équivalent (mais pas identique).
Évidemment, l'éditeur des liens est obligé de bosser derrière pou r
rassembler les morceaux ; cela l'amène à faire des « optimisations » au
passage, qui dans ton cas peuvent apparaître comme sous-optimales...
Donc, un éditeur de liens *nix est prié de transformer les "commons" en
sous-sections (normalement au sein de la section .bss, mais parfois cela
va ailleurs, comme avec Mach-O) et d'allouer les symboles en fonction de
leur plus grande taille. Aussi, l'éditeur des liens peut aussi
transformer une zone .data pleine de 0 en zone .bss, cela fait partie
des optimisations classiques d'un éditeur de liens. Mais il peut aussi
décréter que la zone .bss sera effectivement initialisée au sein du
fichier binaire : une raison habituelle pour faire cela est «
d'économiser » le code qui remplit de zéro la zone .bss, ou pour de s
modules qui vont en ROM et pour lesquels il est impossible d'initialiser
la mémoire avant de s´être assurer qu'elle existe effectivement...
Au final, je pense que c'est ce qui se passe dans ton cas, mais j'ignore
quelle est la raison qui pousse l'éditeur des liens d'Apple à forcer
l'incorporation de la section __bss dans le fichier a.out final :
je suppute que la liaison dynamique (qui est très spécifique) a quelq ue
chose à voir, mais je ne peux pas approfondir plus avec les information s
fournies.
Antoine