调用函数时,内存空间保留给局部变量(形式参数和在函数范围内声明的参数)。 我理解在ANSI C中,因为需要在块的开头声明变量。
但是,对于使用GCC编译的以下C代码,z
变量是否会在块的开头分配其空间,或仅在y
等于{{1 }}?
42
其他更高级别的语言(如Python和Ruby)的行为是否与相似的代码相同?
答案 0 :(得分:1)
这通常通过为堆栈中的在方法中声明的所有变量保留空间来实现。它肯定可以动态地完成它,但这需要每个“潜在”变量在内部表示为一个指针(因为它的地址不能提前知道),并且开销几乎肯定不值得。如果你真的想要“动态”变量,你可以自己用指针和动态内存分配来实现它。
Java和C#做同样的事情:它们为局部变量的总集合保留了空间。
我真的不了解Python或Ruby,但在这些语言中,没有原始数据类型:所有值都是引用并存储在堆上。因此,完全有可能在变量“声明”执行之前,变量引用的值的存储空间不会出现(尽管“声明”在动态语言中并不是真正的东西;它更像是一个对发生的变量的赋值尚不存在)。但请注意,变量本身也需要存储空间(毕竟它是指针) - 然而,动态语言的变量通常被实现为散列图,因此变量本身也可能动态地出现和消失。