c++ - 归根结底,变量标识符是完全没有必要的吗?

标签 c++ compilation machine-code executable-format

我花了很多时间研究 TOC 和编译器设计,尚未完成,但我对这些概念感到满意。另一方面,我对汇编和机器代码的了解非常浅,而且我一直希望/需要连接两侧(代码的 HLL 和 LLL 表示),因为我正在学习 C++ 并非常注意性能和优化讨论。

C++ 是一种静态类型语言:

我的问题是:当我们的变量在代码语句中写成表达式时,所有这些变量(以及其他带有标识符的实体)在运行时是否都变成了虚拟内存位置的寻址指令(对于静态和globals ) 和与局部变量的堆栈地址相关的寻址?

我的意思是,在包括语义和句法验证在内的成功编译之后,在运行时将数据作为目标内存字节的保证实体而不考虑任何标识符或任何检查是不明智的,不再需要符号表?

如果我的问题似乎是由于缺乏学习努力而导致的问题类型(我希望不是这样),请告诉我这一点,并告诉我在哪里阅读。如果是这样的话,那是老实说,因为我现在专注于 C++,还没有机会充分了解低级语言,对此我提前表示歉意。

最佳答案

你说对了。一旦编译为机器代码,就不再有任何变量标识符(或变量类型)的概念。它只是某个位置的字节。 哪个位置由编译器(在编译时)根据变量名确定,或者在全局变量的情况下由链接器(在链接时)确定。

当然,出于调试目的,保留标识符等信息可能很有用。这正是“使用调试信息进行编译”的意思:当您这样做时,编译器会以某种方式将(冗余)标识符嵌入到生成的代码中,以便调试器可以访问它们。或者将它们放在一个单独的文件中;其细节取决于调试信息的格式。

关于c++ - 归根结底,变量标识符是完全没有必要的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38352447/

相关文章:

c++ - 标准在哪里定义 volatile 变量可以更改?

c# - 如何通过将一个C#项目分解为多个项目来加快编译速度

c - C 中的按位右移赋值运算符

motorola - 68000内部是如何表示指令的?

c++ - opencv detectMultiScale3 中的 levelWeights 是什么意思?

c# - 查找数组中的列总数

c++ - OpenCV 或 Boost 智能指针

docker Ubuntu 16.04 中的 Linux 编译 - 未创建依赖文件

java - 当枚举类型至少包含一个 "extended"枚举时,为什么将枚举强制转换为任何接口(interface)都不会导致 Java 中的编译错误?

javascript - 为什么 JavaScript 会被编译成机器码?