为了定义我的奇迹,我认为用一个例子会很棒:
变量x的初始值为2,并具有全局范围
int x = 2;
因为变量x具有全局范围,所以它随处可见,这意味着编译器必须以某种方式记住它的内存地址。无论如何,x然后从名为" bla"
的给定函数改变void bla()
{
x = 5;
}
所以编译器(不知道是什么处理所有这些)会记住这个名字" x"并且可以以某种方式知道属于名称x ...
所以我的问题是:
谢谢!我真的试图不做任何含糊不清的事情但是如果你仍然觉得它很混乱,请评论或建议编辑+请纠正我,如果我错了,再次感谢!
答案 0 :(得分:1)
要获得更深入的理解,您必须参考一些有关语言和编译器设计的学习资源。
C ++语言的定义带有声明点和范围的概念。这些东西需要被编译器尊重,因此对于格式良好的代码中的每个表达式,编译器将知道该表达式属于哪个范围以及范围如何嵌套。
典型的编译器实现将具有数据结构,其中每个范围与符号表相关联,其中列出了当前范围的声明/定义的符号。现在,当编译器(典型的实现,它可能完全不同!)在代码中遇到符号(如x = 5;
)时,它将查看当前作用域的符号表及其父作用域,直到首先找到符号x
。然后,符号用法与其中一个符号表中的符号定义相关联。
删除一些细节,您的示例至少包含以下范围嵌套:
global scope
function bla scope
function bla body scope
由于x
未在任何内部作用域中本地声明/定义,因此编译器会将用法链接到在全局作用域中找到的定义。
从技术上讲,如果程序员编写实际内容会更快 内存地址而不是名称,以便编译器(你可能 现在我知道我不确定处理这些事情的方法 不必用地址替换所有变量等?
当我们谈论开发时,编译器将比程序员在此任务上快得多,所以没有时间在这里保存。
关于程序执行,符号不再存在(调试信息除外),因为编译器正在用程序本地存储器地址替换它。通常,您不能通过手工执行任何操作来节省执行时间,否则将由编译器完成。