Что из приведенного будет в .bss секции данных?
Что в данном примере будет храниться в секции неинициализированных данных (bss)?
int a;
int arr[20];
int main(){}
Попробую высказать свои предложения: а будет инициализирована нулём, ибо имеет статическую продолжительность хранения и попадет в data сегмент. Но что насчёт массива, где будет лежать он?
Ответы (1 шт):
/*Нудные оговорки:*/
Строго говоря, С++ ничего не говорит про секции данных — это понятия уровня конкретной платформы и линкера, так что: а) вопрос не имеет смысла в отрыве от платформы б) компилятор волен сделать всё как считает нужнsv.
Все переменные со статическим сроком хранения (и tread_local) не снабжённые явной константной инициализацией (constant-initialized) инициализируются изначально нулями (zero-initialized). При этом для составных типов (структуры/классы, объединения или массивы) данных каждый их член также инициализируется нулём (для объединений немного по-другому это сформулировано, но сути это не меняет).
Обычно компиляторы помещают все нулевые объекты в секцию .bss. При этом не важно вызвано это явной инициализацией нулём или нет. Так что в примере выше, скорей всего, оба объекта (a и arr) будут находится в секции .bss. Это не сложно проверить:
alexander@goblin /tmp $ cat foo.cpp
int a;
int arr[20];
int main(){}
alexander@goblin /tmp $ gcc foo.cpp
alexander@goblin /tmp $ objdump -t a.out
a.out: формат файла elf64-x86-64
SYMBOL TABLE:
# ...
0000000000004060 g O .bss 0000000000000004 a
0000000000004028 g .bss 0000000000000000 __bss_start
0000000000001125 g F .text 000000000000000b main
0000000000004080 g O .bss 0000000000000050 arr
# ...