Почему тип int занимает 8 байтов в разделе BSS, но 4 байта в разделе DATA
Я пытаюсь узнать структуру исполняемых файлов программы C. Моя среда - GCC и 64-битный процессор Intel.
Рассмотрим следующий код Ca.cc
.
#include <cstdlib>
#include <cstdio>
int x;
int main(){
printf("%d\n", sizeof(x));
return 10;
}
size -o a
шоу
text data bss dec hex filename
1134 552 8 1694 69e a
После того, как я добавил еще одну инициализированную глобальную переменную y.
int y=10;
size a
показывает (гдеa
имя исполняемого файла из a.cc)
text data bss dec hex filename
1134 556 12 1702 6a6 a
Как мы знаем,BSS
раздел хранит размер неинициализированных глобальных переменных иDATA
хранит инициализированные.
int
занимает 8 байтов в BSS?sizeof(x)
в моем коде показывает, чтоint
на самом деле занимает 4 байта.int y=10
добавил 4 байта к данным, что имеет смысл, так какint
должно занять 4 байта. Но почему он добавляет 4 байта в BSS?Разница между двумяsize
команды остаются прежними после удаления двух строк#include ...
.
Обновить: Я думаю, что мое понимание BSS неверно. Он не может хранить неинициализированные глобальные переменные. Как гласит Википедия: «Размер, который BSS потребует во время выполнения, записан в объектном файле, но BSS (в отличие от сегмента данных) не занимает фактического пространства в объектном файле». Например, даже однострочный код Cint main(){}
имеетbss 8
.
8 или 16 BSS происходит отalignment
?