簡體   English   中英

為什么全局變量存儲在堆中?

[英]Why global variables are stored in heap?

為什么在以下示例中,全局變量存儲在堆段中,而不是存儲在data / bss段中?

從map偽文件的以下輸出中,data / bss段是第3行。 這是因為它是讀/寫和匿名的。 以下2個條目是堆(如標簽所示)。

這是/ proc // maps的輸出:

00400000-00405000 r-xp 00000000 08:02 17962770                       myexec
00604000-00605000 r--p 00004000 08:02 17962770                       myexec
00605000-00606000 rw-p 00005000 08:02 17962770                       myexec
00606000-00607000 rw-p 00000000 00:00 0                              [heap]
00607000-00642000 rw-p 00000000 00:00 0                              [heap]
7ffff7a15000-7ffff7bd0000 r-xp 00000000 08:02 22282470               ..libc2.19.so
7ffff7bd0000-7ffff7dcf000 ---p 001bb000 08:02 22282470               ..libc-.19.so
7ffff7dcf000-7ffff7dd3000 r--p 001ba000 08:02 22282470               ..libc-.19.so
7ffff7dd3000-7ffff7dd5000 rw-p 001be000 08:02 22282470               ..libc-.19.so
7ffff7dd5000-7ffff7dda000 rw-p 00000000 00:00 0 
7ffff7dda000-7ffff7dfd000 r-xp 00000000 08:02 22282466               ..ld-2.19.so
7ffff7fec000-7ffff7fef000 rw-p 00000000 00:00 0 
7ffff7ff6000-7ffff7ff7000 rw-p 00000000 00:00 0 
7ffff7ff7000-7ffff7ffa000 rw-p 00000000 00:00 0 
7ffff7ffa000-7ffff7ffc000 r-xp 00000000 00:00 0                       [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00022000 08:02 22282466                ..ld-2.19.so
7ffff7ffd000-7ffff7ffe000 rw-p 00023000 08:02 22282466                ..ld-2.19.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0 
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                       [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0               [vsyscall]

但是,當我打印2個全局變量的位置時,我得到以下屬於堆vm區域的地址:

glb1:6061b0 glb2:6061c0

我使用以下方式打印位置:

printf("glb1:%lx glb2:%lx\n", (uint64_t) &glb1, (uint64_t) &glb2);

BSS / DATA是具有所有全局定義變量的段,默認情況下初始化為特定值或零。 該段是可執行映像的一部分。

堆“段”是只是將在程序裝入待分配的額外的存儲 它不包含在圖像中。 該數量在BSS / DATA段結束時跟隨。

因此,BSS / DATA和堆段具有相同的基址。 將堆段視為虛擬/作為圖像的bss /數據段的虛擬擴展。

最后,請注意,堆棧“段”通常會再次添加到此數量,而堆增長時,堆棧會逐漸減少。 (這可能與編譯器有關。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM