当声明变量时,编译器是否分配4个字节的内存:
int a;
或者在为其分配值时分配内存:
a = 5;
什么时候分配内存?在变量声明或初始化期间?
答案 0 :(得分:6)
在分配包含它的结构时分配变量。
对于方法中的局部变量,当调用该方法时,这是(有一些警告)。
对于静态变量,这是在类初始化时#34; (在它加载之后和第一次使用之前的某个时间发生)。
对于实例变量,这是在创建实例时。
答案 1 :(得分:2)
在大多数编程语言中,允许编译器选择何时为变量分配空间。您唯一可以保证的是,存储将在您需要时可用。
一则简短的轶事......
C编程语言曾要求在方法的顶部声明方法中使用的所有变量。这是因为编译器在您输入方法后立即为方法中的所有堆栈(本地)变量保留存储空间。今天,这个要求并不存在,因为编译器更聪明。
大多数类似C语言的编译器会推迟实例分配,直到首次使用优化代码。这里真正棘手的问题是,第一次使用可能不是你认为的地方,也可能根本不会发生。例如,如果您有以下代码:
int foo(int x) {
int y = 5;
if (x > 5)
y += x;
return y;
}
您可能认为第一次使用是在为y分配5时,但编译器可以将该代码优化为更像:
int foo(int x) {
if (x > 5)
return 5 + x;
return 5;
}
在这段代码中,y根本就不存在。
TL; DR - 编译器实际上并不保证在声明或使用时分配内存。相信编译器,它(通常)比我们所有人都聪明。
答案 2 :(得分:0)
当我们将“声明”变量变为“变量”时,我们意味着我们已经告诉编译器变量;即它的类型和名称,以及为变量分配的存储单元(本地或全局)。编译器的后一个操作,存储分配,更恰当地称为变量的定义。
简单定义 =变量声明+变量初始化