簡體   English   中英

全局(靜態編譯)變量位於何處?

[英]Where are global (statically compiled) variables located?

可以說我有以下程序。 這部分內存是a在分配呢? cc++的行為也一樣嗎?

// a is allocated in the ?
int a[3] = {1, 2, 3};

int main()
{
    // x is allocated in the stack
    int x[3] = {4, 5, 6}

    // y is allocated in the heap
    int* y = malloc(sizeof(int)*3);
}

分配它們的位置取決於您的機器體系結構以及您的編譯器和鏈接器實現(兩者都沒有指定)。 C ++語言標准在這個問題上無話可說。

靜態存儲中 ,要使用標准說話。 它並沒有真正說明應該如何實現靜態存儲 ,除了它應該在程序的整個時間內持續存在,並且如果沒有給出非零初始化器,它應該被隱式零初始化。


實際上在ELF二進制文件中,這些變量都被連接成部分,這些部分在加載時被映射到段上,這些段基本上是具有某些存儲器保護位的存儲器塊。 如果全局變量是可寫的並且使用非零值初始化,則它將進入指定為.data的ELF部分。 zero初始化變量將進入.bss (不是二進制映像的一部分以節省空間),而const靜態變量將進入.rodata ,它將被映射為只讀,以便於寫保護。

您的編譯器的binutils(例如nmobjdump )可以讓您查看(依賴於實現的)詳細信息。

這是一個實現細節, 堆棧也是如此。 語言C沒有這樣的概念。 如果您的實現使用 ,它可能還使用操作系統提供的二進制格式的段。 在這種情況下,靜態變量放在databss段中,因此它們既可以是程序本身(數據)的一部分,也可以在加載程序時由OS分配(bss)。

一種常見的方法是將默認初始化變量放在bss因為這樣,它們不會增加可執行文件的大小。 對於常量數據,通常有一個rodata段可用,許多C編譯器將字符串文字放在那里。

但底線是:你不應該關心,因為C沒有指定這個,並且有些平台不提供段或堆,...

暫無
暫無

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

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