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