C++程序中的变量名存储在哪里?

问题描述 投票:0回答:4

比如我定义一个变量

int a=5;

我知道

5
存储在堆栈中,但是
a
存储在哪里? 请帮助

c++ variables
4个回答
3
投票

C++程序中的变量名存储在哪里?

变量名存储在源代码中。

生成的程序的细节超出了语言的范围,但通常情况下,变量名存储在“调试信息”中——如果它们被存储的话。


3
投票

这里是一个完整的最小示例,演示了@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
是通过文件名+行连接的 到其原始源文件位置。


0
投票

变量名在编译过程后不存在(例外:共享库中的全局变量)。 整个想法是将您的源代码转换为机器指令。

int a = 5;

假设这是您的全局变量,编译器和链接器将在内存中为它分配一个地址,比方说 0xFFFFFFFF & 此后,与该变量相关的所有操作(读/写/修改)都将通过访问该地址来完成.


0
投票

变量的名称在编译时被编译器替换为内存地址。

© www.soinside.com 2019 - 2024. All rights reserved.