内存的动态分配

让我们考虑以下两个代码

第一:

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倍。


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


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

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

如果你想知道更多,这两个问题涵盖了这个问题

  • C ++更快:堆栈分配或堆分配
  • 什么和堆栈和堆在哪里

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


    只需确认2个以前的答案,分析此类代码(在Visual Studio中)并查看汇编代码时,首先调用操作符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 
    }
    
    链接地址: http://www.djcxy.com/p/79175.html

    上一篇: Dynamic allocation of memory

    下一篇: Why does Ruby use its own syntax for safe navigation operator?