c++ - 当通过名称引用时,名称存储在哪里?

标签 c++ c variables

比如我们定义一个变量后:

int a=2;

之后我们可以将“a”用作2。
刚开始学c/c++的时候,觉得理所当然。
但是在了解了“指针”的概念和变量的地址之后,我就一头雾水了。

如果 int* p=&i;,其中“i”是一个整数。我知道 p 有 i 的地址,所以我们可以使用 *p 来获取 i 的值。但如果我们更进一步,“p”是如何访问的呢?似乎 p 必须通过名称引用,对吧?

到目前为止,通过地址访问变量对我来说似乎更自然也更容易理解。
但是现在,我对使用最简单的方法访问变量的机制感到困惑。
int a=2; 的情况一样,名称“a”存储在哪里?

为什么我们使用“a”,就相当于访问存储“a”或“2”的内存的行为?

最佳答案

这里的a只是一个符号名。如果它是局部变量,则不会存储在任何地方。编译器只是在编译阶段使用它,引用实际值(可以在堆栈或寄存器中),然后丢弃。

如果您查看编译器生成的程序集,您会注意到 a 没有出现在那里(或者可能出现在注释中)。编译器会将您的变量放在某处,然后仅使用该位置(例如 x86 上的 eax 寄存器)。

如果您查看 LLVM 程序集(这很有趣),您会注意到编译器只是将您的变量视为 @1@2@3...

另一方面,如果 a 是一个全局变量(并且是一个非 static 的变量),该名称实际上将在符号表中用于引用变量。但它会反过来——变量会被放置在没有名称的地方,符号表会将该名称映射到该位置,以便其他程序可以找到它。


附带说明:如果程序是使用调试数据编译的,名称 a 会存储在那里,以便调试器可以显示它以帮助您了解正在发生的事情。

关于c++ - 当通过名称引用时,名称存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11735481/

相关文章:

c++ - sprintf_s 问题

c - 如何打印值列表?

javascript - 如何在 href 中使用 JavaScript 变量?

c++ - 静态变量,单独编译

c++ - 是否可以忽略 UnMapViewOFFile() 的错误 487 (ERROR_INVALID_ADDRESS)?

c++ - 如何模拟模板化类中的函数?

c++ - 访问对字符串的引用时崩溃

c - 在 C 中通过引用传递

Javax.el,ELResolver : Resolve dependencies between variables

c++ - 从 std::vector 创建点云