比如我们定义一个变量后:
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/