长变量名称是否浪费内存?

jav*_*guy 2 language-agnostic optimization coding-style

如果我有一个变量int d; // some comment.这会比int daysElapsedSinceBlahBlahBlahBlah没有评论更好.这是更多的reabale,但它会浪费记忆吗?

Som*_*ame 7

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

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


小智 6

变量名从不占用内存.至少还不够,甚至开始担心它.虽然某些语言实现会将变量名称存储在某个地方(有时候语言甚至需要这个),但与其他所有东西相比,它们占用的空间绝对微不足道.只需使用其他指标(可读性,约定等)最好的东西.


Boa*_*ann 5

它完全取决于语言及其实现,但是我可以根据一些我所知道的语言为您提供一些示例。

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

在Java中,编译器将消除函数局部变量名称,并重写代码以使用相对于堆栈的偏移量。字段名称(即类级别的变量)确实保留在已编译的字节码中。这是必需的,主要是因为类的单独编译方式以及可以在运行时动态链接的方式,因此编译器无法立即优化整个程序的状态。保留字段名称的另一个原因是因为它们可以通过反射使用。在运行时,虚拟机可以生成本机代码,该本机代码仅以C&C ++的方式仅使用内存地址和本机CPU寄存器。字段名称始终保留在内存中以进行反射,以便可以链接任何其他已加载的类。中间阶段的全程序优化器和混淆器,例如ProGuard 可以使所有符号名称更短。

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

在真正的逐行解释器中,就像非常老的BASIC实现一样,变量名必须始终保持不变,因为解释器直接从源代码运行。前进到下一行时,它会忘记每一行,因此,除了按源中的变量名外,它无法跟踪变量。由于完整的源代码必须在运行时保存在内存中,并且通常限于64 kB或更小,因此变量名确实很重要!出于这个原因,这个时代的代码经常使用(简称(重复使用))加密的短名称(也出于其他原因,例如有时在杂志中印刷BASIC代码以供键入),并且这些平台没有特别好的键盘或编辑。)

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