e.g。
int a=3;//-----------------------(1)
和
int a_long_variable_name_used_instead_of_small_one=3;//-------------(2)
(1)和(2)中的会获得更多的存储空间或相等的空间吗?
答案 0 :(得分:18)
在C ++和大多数静态编译的语言中,变量名称在编译过程中可能占用更多空间,但是通过运行时名称将被丢弃,因此根本不占用空间。
在提供运行时内省/反射的解释型语言和编译语言中,名称可能会占用更多空间。
此外,语言实现将影响空间变量名称占用的数量。实现者可能已决定对每个变量名使用固定长度的缓冲区,在这种情况下,无论长度如何,每个名称都占用相同的空间。或者他们可能根据长度动态分配空间。
答案 1 :(得分:8)
两者都占用相同的内存量。变量名只是为了帮助您,程序员,记住变量的用途,并帮助编译器关联同一变量的不同用法。除了调试符号外,它们在编译的代码中没有出现。
答案 2 :(得分:6)
在大多数解释型语言中,名称将存储在内存中的某个表中,从而占用不同的空间量。
答案 3 :(得分:5)
您在C / C ++中为变量赋予的名称不会影响生成的可执行代码的大小。当您声明一个这样的变量时,编译器保留内存空间(在x86 / x64上为int的情况下,四个字节)来存储该值。要访问或更改该值,它将使用地址而不是变量名称(在编译过程中丢失)。
答案 4 :(得分:2)
如果我的理解是正确的,他们会占用相同数量的记忆。 我相信(并准备好在火焰中击落)在C ++中,名称是象征性的,以帮助用户和编译器将只创建一个足以保存您声明的类型的内存块,在本例中为int。 因此,它们都应占用相同的内存大小,即保存地址所需的内存。
答案 5 :(得分:2)
对于C ++,
$ cat name.cpp
int main() {
int a = 74678;
int bcdefghijklmnopqrstuvwxyz = 5664;
}
$ g++ -S name.cpp
$ cat name.s
.file "name.cpp"
.text
.align 2
.globl main
.type main, @function
main:
.LFB2:
pushl %ebp
.LCFI0:
movl %esp, %ebp
.LCFI1:
subl $8, %esp
.LCFI2:
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
subl %eax, %esp
movl $74678, -4(%ebp)
movl $5664, -8(%ebp)
movl $0, %eax
leave
ret
.LFE2:
.size main, .-main
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.4.6 20060404 (Red Hat 3.4.6-11.0.1)"
$
如您所见,a
和bcdefghijklmnopqrstuvwxyz
都不反映在汇编程序输出中。因此,变量名的长度在运行时在内存方面无关紧要。
但是,变量名称是程序设计的重要贡献者。一些程序员甚至依赖于良好的命名约定而不是注释来解释他们程序的设计。
Hacker News的相关引用,
应编写代码,以便完全描述程序对人类读者的功能,并且只是偶然地被计算机解释。很长一段时间我们很难记住短名称,我们很难连续一遍地看着长名。此外,短名称带来更高的碰撞可能性(因为搜索空间较小),但在短时间阅读时更容易“保持”。
因此,我们命名事物的惯例应该考虑到人类大脑的局限性。变量名称的长度应与其定义与其使用之间的距离成比例,并与其使用频率成反比。
答案 6 :(得分:1)
在现代编译器中,变量的名称不会影响在C ++中保存变量所需的空间量。
答案 7 :(得分:1)
Java中的字段名称(实例变量名称)使用内存,但每个字段只使用一次。这是为了反思工作。对于基于JVM的其他语言也是如此,我猜想DotNet。
答案 8 :(得分:0)
不。两者都会占据相同的空间..
答案 9 :(得分:0)
编译器是有原因的...... 他们优化代码以尽可能使用一点空间,并尽可能快地运行,特别是现代的。