[英]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.