2013-03-09 95 views
2

如果我有一个变量int d; // some comment。 这会比int daysElapsedSinceBlahBlahBlahBlah好,没有任何评论。 这是更加reabale,但它会浪费记忆?长变量名是否浪费内存?

+3

这可能会引起讨论。这不是关于你面对的具体编程问题,或者如何解决它。在我看来,这不太适合。此外,它高度依赖于上下文。 – 2013-03-09 21:43:30

+3

@BenjaminGruenbaum编程问题(至少是假设的)已清楚陈述。上下文相关性应该是答案的一部分 – SomeWittyUsername 2013-03-09 21:53:24

+0

@icepack这是一个偏好问题,这个问题是开放性的。 – 2013-03-09 21:54:13

回答

4

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

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

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

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

在真正的逐行解释程序中,像很老的BASIC实现一样,必须始终保持变量名,因为解释程序直接从源代码运行。当它移动到下一行时,它会忘记每一行,因此除了在源代码中使用它们的名称之外,它无法跟踪变量。由于完整的源代码必须在运行时保存在内存中,并且通常限制在64 kB或更少,所以变量名称确实很重要!这个时代的代码经常使用(和重复使用)加密的短名称,因为这个原因(也出于其他原因,比如BASIC代码有时被打印在需要输入的杂志中,而这些平台没有特别好的键盘或编辑。)

除非您为80年代或更早版本的翻译编程,否则无论如何标识符名称都很便宜,您不必担心。选择足够长的可以理解的名称,并且足够短以便快速阅读。让编译器担心其余部分,或者在编写代码后运行优化程序或代码minifier

7

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

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

6

变量名称从不占用内存。至少还不足以甚至开始担心它。尽管某些语言实现将变量名称存储在某个地方(有时语言甚至需要这样做),但与其他所有环境相比,它们占用的空间相当小。只要使用其他指标(可读性,惯例等)最好的方法。