如果我有变量int d; // some comment
。
这会比int daysElapsedSinceBlahBlahBlahBlah
好,没有评论。
这是更重要的,但它会浪费记忆吗?
答案 0 :(得分:7)
您将此标记为language-agnostic
,但该示例对应于C语言系列。在类C语言中,变量的名称不应该浪费内存,它只是编译器的标签。在生成的二进制代码中,它将被内存地址替换。
通常,将变量名称存储在生成的二进制文件中没有任何好处,我能想到的唯一用法是一些极端调试,逆向工程或一些奇怪的反射形式。这些都不是正常的用例。
答案 1 :(得分:6)
变量名从不占用内存。至少还不够,甚至开始担心它。虽然某些语言实现会将变量名存储在某个地方(有时语言甚至需要这样),但与其他所有东西相比,它们占用的空间绝对微不足道。只需使用其他指标(可读性,约定等)最好的东西。
答案 2 :(得分:4)
这完全取决于语言及其实现,但我可以根据我所知的一些语言给你一些例子。
在C和C ++中,变量名是程序员和编译器的符号标识符。编译器将它们替换为内存地址,CPU寄存器或以其他方式内联其访问以完全消除它们。名称不会出现在生成的代码中。它们可以出现在生成的调试信息中,但是当您不再需要进行交互式步骤调试时,可以省略对于程序的发布版本。
在Java中,编译器消除了函数本地变量名称,并重写代码以使用堆栈相对偏移量。字段名称(即类级别的变量)在编译的字节码中保持不变。这主要是因为类是单独编译的方式,并且可以在运行时动态链接,因此编译器无法立即优化整个程序的状态。保留字段名称的另一个原因是因为它们可以通过reflection获得。在运行时,虚拟机可以生成本机代码,该代码主要仅以C& C的方式使用内存地址和本机CPU寄存器。 C ++。无论如何,字段名称都保存在内存中,以便进行反射,以便可以链接任何其他已加载的类。中期整个程序优化器&像ProGuard这样的混淆器可以使所有符号名称缩短得更短。
在具有eval功能的语言中,例如JavaScript和PHP,理论上甚至必须保留局部变量名,因为它们都可以通过运行时字符串按名称访问。一个好的解释器可以优化它以使用快速内存地址,以防它可以证明特定变量不是通过名称访问的。
在真正的逐行解释器中,就像BASIC的非常古老的实现一样,变量名必须始终保持不变,因为解释器直接从源代码运行。当它移动到下一行时,它会忘记每一行,因此除了源中的名称之外,它无法跟踪变量。由于完整的源代码必须在运行时保存在内存中,并且通常限制在64 kB或更低,因此变量名称确实很重要!这个时代的代码经常使用(并重复使用)密码短名称(但也出于其他原因,例如BASIC代码有时会在杂志中打印出来的方式,这些平台没有特别好的键盘或编辑。)
除非您从20世纪80年代或更早的时候开始为口译员编程,否则标识符名称在任何情况下都是如此便宜,您不必担心它。选择足够长且易于理解的名称,并且足够短以便快速阅读。让编译器担心其余部分,或者在编写完代码后运行优化器或minifier。