4

如果我有一个变量int d; // some comment. 这会比int daysElapsedSinceBlahBlahBlahBlah没有评论更好。它更可重复,但它会浪费内存吗?

4

3 回答 3

8

您将其标记为,language-agnostic但该示例对应于 C 语言系列。在类 C 语言中,变量的名称不应该浪费内存,它只是编译器的标签。在生成的二进制代码中,它将被内存地址替换。

一般来说,将变量的名称存储在生成的二进制文件中没有任何好处,我能想到的唯一用法是一些极端的调试、逆向工程或一些奇怪的反射形式。这些都不是正常的用例。

于 2013-03-09T21:45:53.707 回答
7

这完全取决于语言及其实现,但我可以根据我所知道的几种语言给你一些例子。

在 C 和 C++ 中,变量名是程序员和编译器的符号标识符。编译器将它们替换为内存地址、CPU 寄存器或以其他方式内联它们的访问以完全消除它们。这些名称不会出现在生成的代码中。它们可以出现在生成的调试信息中,但是当您不再需要进行交互式步进调试时,您可以在程序的发布版本中省略它。

在 Java 中,编译器消除了函数局部变量名称并重写代码以使用堆栈相对偏移量。字段名称(即类级别的变量)确实保留在编译的字节码中。这主要是因为类是单独编译的,并且可以在运行时动态链接,所以编译器不能一次优化整个程序的状态。保留字段名称的另一个原因是它们可以通过反射获得。在运行时,虚拟机可以生成本机代码,这些本机代码主要以 C 和 C++ 的方式使用内存地址和本机 CPU 寄存器。无论如何,字段名称都保存在内存中,以便进行反射,以便可以链接任何其他加载的类。中期全程序优化器和混淆器,如ProGuard虽然可以使所有符号名称更短。

在具有eval函数的语言中,例如 JavaScript 和 PHP,即使是局部变量名,理论上也必须保留,因为它们都可以通过运行时字符串按名称访问。一个好的解释器可以优化它以使用快速内存​​地址,以防它可以证明特定变量不是按名称访问的。

在真正的逐行解释器中,就像非常古老的BASIC实现一样,变量名必须始终保留,因为解释器直接从源代码操作。当它移动到下一行时,它会忘记每一行,因此它无法跟踪变量,除非通过它们在源中的名称。由于完整的源代码必须在运行时保存在内存中,而且通常限制在 64 kB 或更小,因此变量名真的很重要!由于这个原因,这个时代的代码经常使用(和重复使用)神秘的短名称(但也有其他原因,例如 BASIC 代码有时打印在杂志上以供输入,而这些平台没有特别好的键盘或编辑。)

除非您正在为 1980 年代或更早的解释器编程,否则标识符名称在任何情况下都非常便宜,您不必担心。选择足够长以便易于理解的名称,并且足够短以便快速阅读。让编译器担心其余的事情,或者在编写代码后对代码运行优化器或压缩器。

于 2013-03-14T13:20:34.273 回答
6

变量名从不占用内存。至少还不足以开始担心它。虽然某些语言实现会将变量名存储在某处(有时该语言甚至需要这样做),但与其他所有东西相比,它们占用的空间绝对很小。只需使用其他指标(可读性、约定等)最好的。

于 2013-03-09T22:00:22.183 回答