首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问,栈比堆快很多

2013-10-19 
请教,栈比堆快很多?char buf2[12345678] --栈char* buf2 new char[12345678]-- 堆栈很快,但是很小,只有

请教,栈比堆快很多?
char buf2[12345678]; --栈
char* buf2= new char[12345678];  -- 堆

栈很快,但是很小,只有1M?
那为什么我的程序char buf2[12345678]; 并fread 10M数据到buf2 通过了呢,执行结果正确

堆很大,但很慢,且频繁的new/delete容易造成内存碎片,进一步影响性能

那到底用什么?堆和栈都不能用了啊

堆很慢,到底比栈慢多少?


[解决办法]
世上没有完美。
栈的申请和释放只需要移动栈顶指针,当然是很快,但优点的另一面就是缺点,只用栈顶指针来管理内存的栈必须遵循先进后出原则,也就是如果你申请了一块内存,在你释放它之前,所有在它之前申请的内存全部不能释放!
堆的申请并不比栈要慢多少,在内存中找一块能用的划出来就行。但堆的释放比栈要慢得多,因为你释放了一块内存后,必须将这块内存和它旁边的内存重新联在一起,以加速下一次的申请。和栈不同的是,堆中申请的所有内存都彼此独立。

栈可以定义的很大,但定义的越大使用的越多,内存使用效率就越低。
所以1M一般来说够用了,如果程序需要更大的栈,那一般是程序设计有问题。
[解决办法]

引用:
http://www.cnblogs.com/likwo/archive/2010/12/20/1911026.html

这篇文是对是错 先不说 
文里面也只是说 分配堆内存 不 分配栈内存满 
可没有说访问堆内存 比 访问栈内存慢 
..........
[解决办法]
引用:
Quote: 引用:


多谢,又学到了点
想再请教一下
1、堆的释放比栈的释放大致慢多少?
2、我读文件,一般从几百K的文件到几百M的文件大小不等
   这样我想申请一块和最大的文件一样的内存
   然后,所有文件的读入都在都读到这个内存里,全部文件处理完后,delete这个内存一次
   避免每次读文件都申请内存并释放。这样做是否合适?
   另外,如果小文件,使用大内存读写,是否影响性能?
谢谢

1 由具体硬件和内存管理机制决定,情况不同结果也不同,我说的只是通常情况下。极端情况下,你有无限大的内存,那你可以根本不需要堆内存释放后的处理
2 申请内存只是宣告这块内存归你管,你使用它的多少无所谓。一个常用的“内存池”思想就是你申请一块很大的堆内存,然后每次使用都自己从里面划一块,用完放回去,这样就相当于自己管理内存,可以根据使用需求做特定方向的优化,效率可能比操作系统提供的通用算法要高。
[解决办法]
引用:
多谢!
我的意思是我有比如10个文件,最小的100K,最大的200M
于是我new 200M内存,然后依次fread每个文件到200M的内存区域
那么全部文件处理完后delete这个内存区域
这样做是否合适?对于100k的文件来说,是否申请100K的内存效率更高?

只申请一次的话,当然100k的更容易申请
你这样的情况,直接申请200M的效率更高

热点排行