Я пытаюсь понять, как работает распределение памяти для любого кода C, который выполняется или компилируется.
Я написал следующие 5 отдельных небольших кодов, которые помогут мне понять процесс выделения памяти.
segment_size1.c
int main(){
printf("hellow world");
return 0;
}
segment_size2.c
//Adding uninitialized static int variable This would increase the size of BSS by 4 bytes.
int main()
{
static int mystatic;
printf("Hellow world");
return 0;
}
segment_size3.c
// Adding initialized static int variable, this would increase the size of initialized data
// segment by 4 bytes.
int main()
{
static int mystatic;
static int mystatic1 = 100;
printf("Hellow world");
return 0;
}
segment_size4.c
// Adding un-initialized global int variable, this would increase the size of BSS segment by 4 bytes.
int myglobal;
int main()
{
static int mystatic;
static int mystatic1 = 100;
printf("Hellow world");
return 0;
}
segment_size5.c
// Adding initialized global int variable, this would increase the size of data segment by 4 bytes.
int myglobal;
int myglobal2 = 500;
int main()
{
static int mystatic;
static int mystatic1 = 100;
printf("Hellow world");
return 0;
}
Согласно моему пониманию, если мы скомпилируем вышеуказанные файлы, то после компиляции сегмент_сайта2.с размер BSS должен увеличиваться на 4 байта, а после компиляции сегмент_сайз3.с Размер данных должен увеличиваться на 4 байта.
Но когда я нажал команду размера, я получил следующие результаты:
size segment_size1 segment_size2 segment_size3 segment_size4 segment_size5
text data bss dec hex filename
1217 560 8 1785 6f9 segment_size1
1217 560 8 1785 6f9 segment_size2
1217 564 12 1793 701 segment_size3
1217 564 12 1793 701 segment_size4
1217 568 16 1801 709 segment_size5
Здесь мы можем ясно видеть, что bss и сегмент данных одновременно обновляются после компиляции сегмент__размера3. Как это возможно?