簡體   English   中英

C 的激活記錄中的全局變量位於何處?

[英]Where are global variables located in the activation record for C?

在 C 中,每個 function 都有一個在堆棧幀上分配的激活記錄。 局部變量分配在它們自己的函數的激活記錄中。 那么,全局變量是怎么回事呢? 它們分配在哪里?

例如

#include <stdio.h>
    int a;

    void v()
    {a= 2;
    int b;
    b++;
    }

    main()
    {
    int f;
    printf("\n%d",a);
    v();
    }


-----Activation record----

-------------------
-------------------
activation record for main
-------------------
int f
-------------------
-------------------
activation record of v
--------------------
int a
--------------------
int b
--------------------
---------------

根據激活記錄邏輯,變量x存儲在哪里?

在 C 中,每個 function 都有一個在堆棧幀上分配的激活記錄。

沒有。 但是,編譯器通常是這樣解決的。 至少如果您沒有激活任何優化。

首先,C 標准根本沒有提到堆棧。 所以這個問題的答案將是關於它在實踐中通常是如何解決的。

通常它們位於數據段或 bss 段中。 典型的布局如下所示:

Stack - Grows down towards the heap. Used for local variables.
-----
...
...
...
----
Heap - Grows up towards the stack. Used for dynamically allocated memory.
----
BSS - Uninitialized data. Used for uninitialized global and static variables.
----
Data - Initialized data. 
----
Text - Runnable code

在 C 中,每個 function 都有一個在堆棧幀上分配的激活記錄。

了,優化編譯器可能不會這樣做(並且gcc -O3 -flto不會,在 Linux / x86-64 和最近的Z32D8B233E3C58A262A0B75872Z297 上)。 它將內聯一些函數。 一些本地變量只保存在一些處理器寄存器中(因此沒有 memory 位置)。 閱讀有關寄存器分配的信息,例如在Dragon Book或其他一些關於編譯器的教科書中。 注意自動變量 另請注意,您甚至不需要計算機來運行 C 程序(教學 C 的好方法是讓課堂游戲成為計算機;您可以用鉛筆在紙上運行 Z0D61F8370CAD1D412F87B84D14 程序)。

全局變量通常不在調用堆棧(保存調用幀或激活記錄)上。 它們可能位於數據段中(並且可以完全優化)。

C11 規范不需要任何調用堆棧。 通過閱讀n1570進行檢查。 一些實現不使用任何調用堆棧(或激活記錄)。 請注意crt0調用您的main

閱讀鏈接器和加載器了解更多信息。 另請閱讀有關操作系統的教科書

在 Linux 上,嘗試cat /proc/self/maps以了解運行該cat命令的進程虛擬地址空間 參見過程(5)

使用 Linux 查看由gcc -O2 -fverbose-asm -S生成的匯編代碼。 閱讀有關調用 GCC的信息。

另請參閱此答案

在 Linux 上,在可執行文件object 文件ELF格式)上使用nm(1)readelf(1)objdump(1 )。

暫無
暫無

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

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