[英]When is memory space allocated to a variable?
声明变量时编译器是否分配了 4 个字节的内存:
int a;
或者当一个值被分配给它时它是否分配内存:
a = 5;
什么时候分配内存? 在变量声明或初始化期间?
在分配包含它的结构时分配变量。
对于方法中的局部变量,这是在调用方法时(有一些注意事项)。
对于静态变量,这是“初始化”类的时间(发生在它加载后和第一次使用之前的一段时间)。
对于实例变量,这是创建实例的时间。
在大多数编程语言中,编译器可以选择何时为变量分配空间。 您唯一可以保证的是,存储将在您需要时可用。
一个简短的轶事...
过去的 C 编程语言要求在方法的顶部声明方法中使用的所有变量。 这是因为编译器曾经在您进入方法后立即为方法中的所有堆栈(局部)变量保留存储空间。 今天这个要求不存在的部分原因是编译器要聪明得多。
大多数类 C 语言的编译器会推迟实例的分配,直到第一次用于优化代码。 这里真正棘手的是,第一次使用可能不在您认为的位置,而且可能根本不会发生。 例如,如果您有以下代码:
int foo(int x) {
int y = 5;
if (x > 5)
y += x;
return y;
}
您可能认为第一次使用是当您将 5 分配给 y 时,但编译器可以将该代码优化为更类似的内容:
int foo(int x) {
if (x > 5)
return 5 + x;
return 5;
}
在这段代码中,y 根本不存在。
TL;DR - 编译器实际上并不能保证在声明或使用时分配内存。 相信编译器,它(通常)比我们所有人都聪明。
当我们“声明”一个变量时,意味着我们已经告诉编译器有关该变量的信息; 即它的类型和名称,以及为变量(本地或全局)分配的内存单元。 编译器的后一个动作,存储分配,更恰当地称为变量的定义。
简单定义= 变量声明 + 变量初始化
JVM 将内存分为栈内存和堆内存。 每当我们声明新变量和对象、调用新方法、声明字符串或执行类似操作时,JVM 都会从堆栈内存或堆空间为这些操作指定内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.