比如我定义一个变量
int a=5;
我知道
5
存储在堆栈中,但是a
存储在哪里?
请帮助
C++程序中的变量名存储在哪里?
变量名存储在源代码中。
生成的程序的细节超出了语言的范围,但通常情况下,变量名存储在“调试信息”中——如果它们被存储的话。
这里是一个完整的最小示例,演示了@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
是通过文件名+行连接的
到其原始源文件位置。
变量名在编译过程后不存在(例外:共享库中的全局变量)。 整个想法是将您的源代码转换为机器指令。
int a = 5;
假设这是您的全局变量,编译器和链接器将在内存中为它分配一个地址,比方说 0xFFFFFFFF & 此后,与该变量相关的所有操作(读/写/修改)都将通过访问该地址来完成.
变量的名称在编译时被编译器替换为内存地址。