首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >名称是如何与其相关的内存地址一起被记住的?

名称是如何与其相关的内存地址一起被记住的?
EN

Stack Overflow用户
提问于 2017-04-26 14:37:33
回答 1查看 111关注 0票数 3

为了定义我的奇迹,我想举一个例子是很好的:

  • 变量x的初始值为2,并且具有全局范围。 int x= 2;
  • 因为这个变量x具有全局范围,所以它在任何地方都是可见的,这意味着编译器必须以某种方式记住它的内存地址。无论如何,x将从一个称为"bla“的给定函数中更改。 {x= 5;}
  • 所以编译器(不确定是什么处理这一切)会记住这个名称"x“,并且可以知道属于名称x的内存地址.

所以我的问题是:

  1. 编译器(仍然不确定这一点)是如何记住属于一起的名称/标识符和内存地址的?这些信息存储在哪里-它是否也存储在内存地址中?
  2. 从技术上讲,如果程序员写的是实际的内存地址而不是名称,那么编译器(您可能知道我现在还不知道如何处理这些事情)就不必用地址替换所有的变量等等,这样会更快吗?

谢谢!我真的尽力不让任何东西模棱两可,但如果你仍然感到困惑,请评论或建议编辑+如果我错了请纠正我,再次感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-27 10:47:13

为了更深入地理解,您必须查阅一些关于语言和编译器设计的学习资源。

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

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

在跳过一些细节之后,您的示例至少包含以下作用域嵌套:

代码语言:javascript
运行
复制
global scope
  function bla scope
    function bla body scope

由于x不是在任何内部作用域中本地声明/定义的,所以编译器将将用法链接到全局范围中的定义。

从技术上讲,如果程序员写的是实际的内存地址而不是名称,那么编译器(您可能知道我现在还不知道如何处理这些事情)就不必用地址替换所有的变量等等,这样会更快吗?

当我们谈到开发时,编译器在这个任务上将比程序员快得多,所以这里没有节省时间。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43637302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档