什么是动态内存使用较慢?
这个问题在这里已经有了答案:
抛开缓存问题,CPU堆栈就是这样一个栈,一个LIFO列表/队列。 按照与放置在那里的顺序完全相反的顺序从中移除它。 你不要通过去除它中间的东西来创建洞。 这使得其管理极其微不足道:
memory[--stackpointer] = value; // push
value = memory[stackpointer++]; // pop
或者你可以分配一个大块:
stackpointer -= size; // allocate
memset(&memory[stackpointer], 0, size); // use
并同样释放它:
stackpointer += size; // free
你的堆,OTOH,没有LIFO财产。 为此,它必须分别跟踪所有分配的块。 这意味着它必须具有某种空闲块列表和分配块列表,并且在分配时需要寻找足够大的块并在空闲时查找指定的块,然后可能会在块中分割和合并处理。 简单的堆栈不需要执行任何操作。
这仅仅是两种分配和释放方式之间的重要算法差异。
将物理内存映射到虚拟地址空间的缓存和显式调用也会加起来,但如果在两种情况下都认为它们是相等的,则仍然有几条指令与几十条到几百条指令的差异。
“更好”可能不是一种很好的描述方式,但通常在堆栈上分配内存“更快”,而不是堆上。 你是正确的,它分配的内存比较慢,而不是之后使用内存。
堆分配趋于较慢的原因是堆管理者需要做额外的工作:他们经常试图找到与您请求的大小非常接近的现有内存块,并且在释放块时,他们通常会检查相邻的内存区域看看他们是否可以合并。 堆栈分配只是简单地向指针添加一个值,仅此而已。
链接地址: http://www.djcxy.com/p/13877.html