当按名称引用时,存储的名称在哪里?

dul*_*shi 2 c c++ variables

例如,在我们定义变量之后:

int a=2;
Run Code Online (Sandbox Code Playgroud)

之后我们可以使用"a"作为2.
在我第一次学习c/c ++的时候,我认为这是理所当然的.
但在我学会了"指针"的概念和变量的地址之后,我很困惑.

如果int* p=&i;,"i"是int.我知道p具有i的地址,所以我们可以使用*p来获取i的值.但如果我们走得更远,"p"如何被访问?看来p必须用名字引用,对吗?

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

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

Mic*_*rny 9

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

如果您查看编译器生成的程序集,您会注意到它a没有出现(或者可能在注释中).编译器将适合您的变量,并在之后使用该位置(如eaxx86上的寄存器).

如果你看着一个LLVM组件(这是很有趣的),你会发现,编译器只是把你的变量@1,@2,@3...

另一方面,如果a是全局变量(和非变量static),则实际上将在符号表中使用该名称来引用变量.但它是相反的方式 - 变量将被放置在没有名称的地方,符号表会将该名称映射到该位置,以便其他程序可以找到它.


作为旁注:如果程序是使用调试数据编译的,那么名称a将存储在那里,以便调试器可以显示它以帮助您了解正在发生的事情.