动态分配内存

时间:2010-02-14 14:44:33

标签: c++ dynamic memory-management

让我们考虑以下两个代码

首先:

for (int i=0;i<10000000;i++)
{
    char* tab = new char[500];
    delete[] tab;
}

第二

for (int i=0;i<10000000;i++)
{
    char tab[500];
}

峰值内存使用率几乎相同,但第二个代码运行速度比第一个快20倍。

问题
是因为第一个代码数组存储在堆上,而第二个数组存储在堆栈中?

4 个答案:

答案 0 :(得分:5)

  

是因为第一个代码数组存储在堆上,而第二个数组存储在堆栈中?

是的,堆栈分配要快得多,因为所有第二个代码示例都在移动(添加/减去)堆栈指针而不是操纵堆。

如果您想了解更多,这两个问题涵盖了主题

答案 1 :(得分:2)

是。在堆上分配数组要比自动创建它们慢得多。前者可能涉及系统调用,并且总是涉及操纵堆结构,而后者只是调整堆栈指针。

答案 2 :(得分:1)

只是为了确认2个先前的答案,在分析这样的代码(在Visual Studio中),并查看汇编代码时,首先调用operator new,而不调用第二个,这意味着它在堆栈上自动分配。

以下是它的外观

int _tmain(int argc, _TCHAR* argv[])
{
00401000  push        ebp  
00401001  mov         ebp,esp 
00401003  sub         esp,304h 
00401009  push        ebx  
0040100A  push        esi  
0040100B  push        edi  
0040100C  lea         edi,[ebp-304h] 
00401012  mov         ecx,0C1h 
00401017  mov         eax,0CCCCCCCCh 
0040101C  rep stos    dword ptr es:[edi] 
    for (int i=0;i<10000;i++)
0040101E  mov         dword ptr [i],0 
00401025  jmp         wmain+30h (401030h) 
00401027  mov         eax,dword ptr [i] 
0040102A  add         eax,1 
0040102D  mov         dword ptr [i],eax 
00401030  cmp         dword ptr [i],2710h 
00401037  jge         wmain+6Fh (40106Fh) 
    {
        char* tab = new char[500];
00401039  push        1F4h 
0040103E  call        operator new[] (4010F0h) 
00401043  add         esp,4 
00401046  mov         dword ptr [ebp-300h],eax 
0040104C  mov         eax,dword ptr [ebp-300h] 
00401052  mov         dword ptr [tab],eax 
        delete[] tab;
00401055  mov         eax,dword ptr [tab] 
00401058  mov         dword ptr [ebp-2F4h],eax 
0040105E  mov         ecx,dword ptr [ebp-2F4h] 
00401064  push        ecx  
00401065  call        operator delete[] (401104h) 
0040106A  add         esp,4 
    }
0040106D  jmp         wmain+27h (401027h) 

    for (int i=0;i<10000;i++)
0040106F  mov         dword ptr [i],0 
00401076  jmp         wmain+81h (401081h) 
00401078  mov         eax,dword ptr [i] 
0040107B  add         eax,1 
0040107E  mov         dword ptr [i],eax 
00401081  cmp         dword ptr [i],2710h 
00401088  jge         wmain+8Ch (40108Ch) 
    {
        char tab[500];
    }
0040108A  jmp         wmain+78h (401078h) 

    return 0;
0040108C  xor         eax,eax 
}

答案 3 :(得分:1)

您是否尝试在启用优化的情况下运行?如果在优化器启动后根本没有任何差异,我会非常感到惊讶。实际上,我希望优化器在两种情况下完全删除循环。