变量名如何存储在C中?

变量名如何存储在C中?,c,compiler-construction,C,Compiler Construction,我想问,变量是如何存储在C中的 更清楚地考虑下面的代码: int main() { int a = 1, b; b = a + 2; return 0; } 例如,在这里,C存储变量位置的名称 例如,如果&a=0x12A7(假设)&b=0x123B1,那么如何以及在何处存储变量名,比如存储在哪个内存名a中?根本不需要存储变量名!编译器可以完全消除它们。想象一下,如果编译器相当聪明,它可以将整个程序简化为: int main(){ return 0; } 请注意,这

我想问,变量是如何存储在C中的

更清楚地考虑下面的代码:

int main() {
    int a = 1, b;
    b = a + 2;
    return 0;
}
例如,在这里,C存储变量位置的名称


例如,如果
&a=0x12A7
(假设)
&b=0x123B1
,那么如何以及在何处存储变量名,比如存储在哪个内存名
a
中?

根本不需要存储变量名!编译器可以完全消除它们。想象一下,如果编译器相当聪明,它可以将整个程序简化为:

int main(){
  return 0;
}
请注意,这个程序的效果与您原来的完全相同,现在根本没有变量!现在不必给他们起名字了,是吗

即使代码中的变量实际使用过,它们的名称在编写程序时也只是一种方便的符号,但处理器在执行代码时并不需要它们。就微处理器而言,它具有如下功能:

int foo(int x, int y) {
  int z = x + y;
  return z * 2;
}
在某些假设的简单指令集体系结构(ISA)中,可能会产生这样的编译代码:


更长远的说法是,有时存储变量名是为了调试。例如,如果您正在使用GCC,您可以传递
-g
选项以发出一个“符号表”,其中包含用于调试的变量名等内容。但它并不是简单地运行一个程序所需要的,而且语言标准也没有涵盖它——它是一种实现特性,不同的平台会有所不同。

C不存储变量的名称。它是在编译器的符号表中存储变量名称的编译器。
此数据结构由编译器创建和维护。
代码段的符号表的名称

// Declare an external function
extern double bar(double x);

// Define a public function
double foo(int count)
{
    double  sum = 0.0;

    // Sum all the values bar(1) to bar(count)
    for (int i = 1;  i <= count;  i++)
        sum += bar((double) i);
    return sum;
}  
//声明一个外部函数
外部双杆(双x);
//定义公共功能
双foo(整数计数)
{
双和=0.0;
//将条(1)到条(计数)的所有值相加

对于(int i=1;iOk)首先,如果你正与C发生冲突,这是开始的地方:

但这比你的问题更实际。要回答这个问题,我们首先要问为什么变量有地址。为什么这里是堆栈。对于一个运行返回调用的程序来说,必须将其定向到适当的缓冲区,以便所有的片段都按照设计的方式组合在一起。现在,我认为这是最初的问题,即实际地址是如何定义的cided,要回答这个问题,您必须了解处理器是如何实现堆的

由于事先不知道分配的精确位置,通常通过指针引用间接访问内存。用于组织内存区域、分配和释放块的特定算法与内核互连

这让我们回到了事物的实际方面,对指针进行了抽象:

希望它能让你对引擎盖下的东西有一个更清晰的了解:)


愉快的编码。

符号表是一种编译时结构,它不反映运行时属性。映射文件和调试信息是了解位置符号名称的来源,但它们并不打算在程序中使用。RTTI和其他形式的自省是,但C没有任何形式的自省
// Declare an external function
extern double bar(double x);

// Define a public function
double foo(int count)
{
    double  sum = 0.0;

    // Sum all the values bar(1) to bar(count)
    for (int i = 1;  i <= count;  i++)
        sum += bar((double) i);
    return sum;
}