我创建了一个示例代码,因为我正试图将自己组装起来。
我在堆栈上声明并初始化一个整数,并且对堆上的整数也执行相同的操作。
当查看汇编代码时,它们两个都产生非常相似的代码:
mov dword ptr [ebp-8],0 ; this is on the stack
mov dword ptr [ebp-14h],0 ; this is on the stack
mov eax,dword ptr [ebp-20h] ; this is on the heap
mov dword ptr [eax],0 ; this is on the heap
您能否说明一下我所忽略的内容?
拆卸的相关部分位于以下位置:
int x = 0;
00111848 mov dword ptr [ebp-8],0
int y = 0;
0011184F mov dword ptr [ebp-14h],0
int* z = new int;
00111856 push 4
00111858 call 00111325
0011185D add esp,4
00111860 mov dword ptr [ebp+FFFFFF14h],eax
00111866 mov eax,dword ptr [ebp+FFFFFF14h]
0011186C mov dword ptr [ebp-20h],eax
*z = 0;
0011186F mov eax,dword ptr [ebp-20h]
00111872 mov dword ptr [eax],0
最佳答案
都
int y = ....;
和
int* z = ....;
创建一个自动变量(即在堆栈上)。一个是整数,另一个是指针。
首先用0初始化,另一个用
new int
初始化。这将创建动态对象,并导致对内存分配函数call 00111325
的调用。
关于c++ - 为什么在堆栈和堆上创建变量会产生相同的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59868192/