如何记住名称及其相关的内存地址?

时间:2017-04-26 14:37:34

标签: c++

为了定义我的奇迹,我认为用一个例子会很棒:

  • 变量x的初始值为2,并具有全局范围

    int x = 2;
    
  • 因为变量x具有全局范围,所以它随处可见,这意味着编译器必须以某种方式记住它的内存地址。无论如何,x然后从名为" bla"

    的给定函数改变
    void bla()
    {
        x = 5;
    }
    
  • 所以编译器(不知道是什么处理所有这些)会记住这个名字" x"并且可以以某种方式知道属于名称x ...

  • 的内存地址

所以我的问题是:

  1. 编译器(仍然不确定)是如何记住属于哪个名称/标识符和内存地址的?这些信息存储在何处 - 它是否也存储为内存地址?
  2. 从技术上讲,如果程序员编写实际的内存地址而不是名称会更快,那么编译器(你现在可能知道我不知道处理这些东西的东西)不必替换所有变量等。地址?
  3. 谢谢!我真的试图不做任何含糊不清的事情但是如果你仍然觉得它很混乱,请评论或建议编辑+请纠正我,如果我错了,再次感谢!

1 个答案:

答案 0 :(得分:1)

要获得更深入的理解,您必须参考一些有关语言和编译器设计的学习资源。

C ++语言的定义带有声明点和范围的概念。这些东西需要被编译器尊重,因此对于格式良好的代码中的每个表达式,编译器将知道该表达式属于哪个范围以及范围如何嵌套。

典型的编译器实现将具有数据结构,其中每个范围与符号表相关联,其中列出了当前范围的声明/定义的符号。现在,当编译器(典型的实现,它可能完全不同!)在代码中遇到符号(如x = 5;)时,它将查看当前作用域的符号表及其父作用域,直到首先找到符号x。然后,符号用法与其中一个符号表中的符号定义相关联。

删除一些细节,您的示例至少包含以下范围嵌套:

global scope
  function bla scope
    function bla body scope

由于x未在任何内部作用域中本地声明/定义,因此编译器会将用法链接到在全局作用域中找到的定义。

  

从技术上讲,如果程序员编写实际内容会更快   内存地址而不是名称,以便编译器(你可能   现在我知道我不确定处理这些事情的方法   不必用地址替换所有变量等?

当我们谈论开发时,编译器将比程序员在此任务上快得多,所以没有时间在这里保存。

关于程序执行,符号不再存在(调试信息除外),因为编译器正在用程序本地存储器地址替换它。通常,您不能通过手工执行任何操作来节省执行时间,否则将由编译器完成。