为了定义我的奇迹,我想举一个例子是很好的:
所以我的问题是:
谢谢!我真的尽力不让任何东西模棱两可,但如果你仍然感到困惑,请评论或建议编辑+如果我错了请纠正我,再次感谢!
发布于 2017-04-27 10:47:13
为了更深入地理解,您必须查阅一些关于语言和编译器设计的学习资源。
C++语言的定义附带了声明点和范围的概念。编译器需要尊重这些特性,因此对于格式良好的代码中的每个表达式,编译器将知道该表达式属于哪个范围,以及如何嵌套作用域。
一个典型的编译器实现将具有一个数据结构,其中每个作用域都与一个符号表相关联,其中列出了当前作用域的声明/定义符号。现在,当编译器(典型的实现,它可能是完全不同的!)遇到代码中的符号(如x = 5;),它将查看当前作用域及其父作用域的符号表,直到第一次找到符号x为止。然后,符号用法与符号定义相链接,因为它是在符号表中找到的。
在跳过一些细节之后,您的示例至少包含以下作用域嵌套:
global scope
function bla scope
function bla body scope由于x不是在任何内部作用域中本地声明/定义的,所以编译器将将用法链接到全局范围中的定义。
从技术上讲,如果程序员写的是实际的内存地址而不是名称,那么编译器(您可能知道我现在还不知道如何处理这些事情)就不必用地址替换所有的变量等等,这样会更快吗?
当我们谈到开发时,编译器在这个任务上将比程序员快得多,所以这里没有节省时间。
关于程序执行,符号已经不存在了(除了调试信息),因为编译器正在用它的程序本地内存地址来替换它。通常,您不能通过手工执行任何事情来节省执行时间,否则由编译器来完成。
https://stackoverflow.com/questions/43637302
复制相似问题