簡體   English   中英

C++ 程序中的變量名存儲在哪里?

[英]Where are variable names stored in a C++ program?

例如,我定義了一個變量

int a=5;

我知道 5 存儲在堆棧中,但是 a 存儲在哪里? 請幫忙

C++ 程序中的變量名存儲在哪里?

變量名存儲在源代碼中。

生成的程序的詳細信息不在該語言的 scope 范圍內,但通常情況下,變量名存儲在“調試信息”中——如果它們被存儲的話。

編譯過程后變量名稱不存在(例外:共享庫中的全局變量)。 整個想法是將您的源代碼轉換為機器指令。

int a = 5;

假設這是您的全局變量,它將在 memory 中分配一個地址,比如說 0xFFFFFFFF,由編譯器和 linker 以及此后完成的與該變量有關的所有操作(讀/寫/修改)將通過訪問該地址來完成。

這是一個完整的最小示例,演示了@eerorika 關於調試信息的答案(此處,在 ELF 文件中):

$ cat main.cpp
int main(int argc, char **argv)
{
    int whereIsMyVar = 5;
    return whereIsMyVar;
}

並在沒有優化( -O0調試信息( -g )的情況下編譯它:

$ g++ -g -O0 main.cpp -o main

現在讓我們看看objdump發生了什么:

$ objdump -D -S main > main.asm
$ sed -n "378,389p" main.asm
00000000000005fa <main>:
int main(int argc, char **argv)
{
 5fa:   55                      push   %rbp
 5fb:   48 89 e5                mov    %rsp,%rbp
 5fe:   89 7d ec                mov    %edi,-0x14(%rbp)
 601:   48 89 75 e0             mov    %rsi,-0x20(%rbp)
    int whereIsMyVar = 5;
 605:   c7 45 fc 05 00 00 00    movl   $0x5,-0x4(%rbp) <--- there is your assignment !
    return whereIsMyVar;
 60c:   8b 45 fc                mov    -0x4(%rbp),%eax
}

現在讓我們使用addr2line實用程序輕松提取與該地址對應的源代碼位置:

$ addr2line -e main 0x605
/home/oren/main.cpp:3

最后,讓我們看看源文件 [[ drumroll ]] 第 3 行的內容:

$ sed -n "3,3p" /home/oren/main.cpp
    int whereIsMyVar = 5;

如您所見, whereIsMyVar的名稱通過文件名 + 行連接到其原始源文件位置。

暫無
暫無

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

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