在C ++中,假设没有优化,以下两个程序最终会使用相同的内存分配机器代码吗?
int main()
{
int i;
int *p;
}
int main()
{
int *p = new int;
delete p;
}
答案 0 :(得分:23)
答案 1 :(得分:18)
不,没有优化......
int main()
{
int i;
int *p;
}
几乎什么都没做 - 只是调整堆栈指针的几条指令,但是
int main()
{
int *p = new int;
delete p;
}
在堆上分配一块内存然后释放它,这是一大堆工作(我在这里很认真 - 堆分配不是一个简单的操作)。
答案 2 :(得分:6)
int i;
int *p;
^在堆栈上分配一个整数和一个整数指针
int *p = new int;
delete p;
^堆栈上一个整数指针的分配和堆上整数大小的块
编辑:
Stack segment和Heap segment之间的差异
(来源:maxi-pedia.com)
void another_function(){
int var1_in_other_function; /* Stack- main-y-sr-another_function-var1_in_other_function */
int var2_in_other_function;/* Stack- main-y-sr-another_function-var1_in_other_function-var2_in_other_function */
}
int main() { /* Stack- main */
int y; /* Stack- main-y */
char str; /* Stack- main-y-sr */
another_function(); /*Stack- main-y-sr-another_function*/
return 1 ; /* Stack- main-y-sr */ //stack will be empty after this statement
}
每当任何程序开始执行时,它会将所有变量存储在名为堆栈段的特殊存储器内存位置。例如,在C / C ++的情况下,第一个被调用的函数是main。所以它将首先放在堆栈上。 main中的任何变量都将在程序执行时置于堆栈中。现在main是第一个被调用的函数,它将是最后一个返回任何值的函数(或者将从堆栈中弹出)。
现在,当您使用new
动态分配内存时,会使用另一个称为堆段的特殊内存位置。即使堆指针上存在实际数据也位于堆栈上。
答案 3 :(得分:2)
听起来你不知道堆栈和堆。你的第一个例子是在堆栈上分配一些内存,一旦超出范围就会被删除。使用malloc / new获取的堆上的内存将保持不变,直到您使用free / delete删除它。
答案 4 :(得分:2)
在第一个程序中,您的变量都驻留在堆栈中。你没有分配任何动态内存。 'p'只是坐在堆栈上,如果你取消引用它,你会得到垃圾。在第二个程序中,您实际上是在堆上创建一个整数值。在这种情况下,'p'实际上指向一些有效的内存。你实际上可以取消引用p并将其设置为安全有意义的东西:
*p = 5;
这在第二个程序(删除前)中有效,而不是第一个。希望有所帮助。