【问题标题】:How is a variable name stored in C?变量名如何存储在 C 中?
【发布时间】:2015-12-20 14:55:41
【问题描述】:

我想问一下C中的变量是如何存储在C中的?

为了更清楚,请考虑以下代码:

int main() {
    int a = 1, b;
    b = a + 2;
    return 0;
}

例如这里的内存 C 存储变量位置的名称。

例如,如果&a=0x12A7(假设)&b=0x123B1,那么 如何以及在哪里存储变量名称,就像存储在哪个内存名称a 中一样?

【问题讨论】:

    标签: c c compiler-construction


    【解决方案1】:

    变量名根本不需要存储!编译器可以完全摆脱它们。想象一下,如果编译器非常聪明,它可以将你的整个程序简化为:

    int main(){
      return 0;
    }
    

    注意这个程序的效果和你原来的一模一样,现在完全没有变量了!现在不用给他们命名了吧?

    即使实际使用了代码中的变量,它们的名称在您编写程序时也只是一种方便的符号,但处理器在执行您的代码时并不需要它们。就微处理器而言,类似这样的函数:

    int foo(int x, int y) {
      int z = x + y;
      return z * 2;
    }
    

    在一些假设的简单指令集架构 (ISA) 中,可能会产生执行此操作的编译代码:

    ADD # consumes top two values on stack (x and y), pushes result (z)
    PUSH 2 # pushes 2 on stack
    MULT # consumes top two values on stack (z and 2), pushes result
    RET
    

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

    【讨论】:

      【解决方案2】:

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

      // 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;
      }  
      

      至少可以包含以下符号:

      【讨论】:

      • 符号表是一个编译时构造,它不反映运行时属性。地图文件和调试信息是可用于了解位置符号名称的来源,但它们并不打算在程序中使用。RTTI 和其他形式的内省是,但 C 没有任何形式
      【解决方案3】:

      好吧,如果你只是想用 C 来解决问题,那么首先要从这里开始: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml

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

      https://en.wikipedia.org/wiki/Memory_management

      “由于事先不知道分配的确切位置,所以内存是间接访问的,通常通过指针引用。用于组织内存区域和分配和释放块的具体算法与内核相互关联。. 。”

      这让我们回到了抽象指针的实际方面:

      https://en.wikipedia.org/wiki/C_dynamic_memory_allocation

      希望它能让您更清楚地了解引擎盖下的内容:)

      编码愉快。

      【讨论】:

        猜你喜欢
        • 2013-01-14
        • 2017-09-07
        • 1970-01-01
        • 2014-02-24
        • 1970-01-01
        • 2012-09-15
        • 2013-04-01
        • 1970-01-01
        • 2021-05-01
        相关资源
        最近更新 更多