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

为啥栈空间的访问速度要快于堆

2012-10-07 
为什么栈空间的访问速度要快于堆如题,向各位高手请教(今天面试被问到了,悲剧)[解决办法]这个是几十年前的

为什么栈空间的访问速度要快于堆
如题,向各位高手请教(今天面试被问到了,悲剧)

[解决办法]
这个是几十年前的答案一直在误传。
在现在的cpu架构下,极可能没有差异。
[解决办法]
栈是CPU实现的,堆是内存的数据(或许第一次请求是还在硬盘里面)。
[解决办法]
栈用来存放局部变量,堆一般用来动态分配。

C/C++ code
int func(void){    int tmp;//使用栈空间    int *ptr=NULL;    ptr=(int *)malloc(sizeof(tmp));//使用堆    free(ptr);    ptr=NULL;    return 0}
[解决办法]
栈中的内存通过SP寄存器定位,堆中的内存通过某个寄存器定位到一个包含一个地址的内存,然后再通过这个地址定位到具体的内存位置。堆多了一级间接,所以综合来说会比栈慢。
另外由于栈访问比较频繁,被高速Cache缓存的几率比较大,速度也会快一点。
[解决办法]
究其根源,个人觉得,应该都是一段内存条中的内存区域,原则上没有多大的访问速度差别,但是栈是程序运行的上下文、是必须的结构,在程序编译、连接时直接自动分配的。可能obj文件中就已经有了其在内存中的地址(相对于文件的加载地址的偏移量)。而堆上的数据最早出现时刻应该是在运行时库中,由堆初始化函数,类似于heap_initialize名称的函数来完成,也就是在程序加载完成后的一部分内存空间中再额外开辟一部分空间,备后期的使用,每取用一块区间,就会从初始化产生的链表式的对空间中选取一个符合你要求的内存块。通过new操作符来实现。
所以说堆对CPU来说是就好像是已经被分割出去的或者被别人霸占了的领土,就像钓鱼岛让小日本霸占一样,虽然是我们的领土,我们想登岛,总归是有一点阻碍的。
所以强烈要求收复钓鱼岛。
[解决办法]
一级缓存。。二级缓存。。

CPU MEMORY DISK U盘 这些都是有区别的。。
[解决办法]
C/C++ code
void func(void){    int tmp,*ptr=NULL,tmpmid;    ptr=(int *)malloc(sizeof(tmp));    tmp=1;    *ptr=2;    tmpmid=tmp;    tmpmid=*ptr;    free(ptr);    ptr=NULL;}
[解决办法]
用过TC的人不少,应该知道它有两个自己的关键字,near,far来修饰指针,即近(短)指针和远(长指针),用它解释,不知合适不?
对栈数据的访问时,确定栈的SP(start position)后,就用短指针(16位)-在段内访问(64K范围)。
而对堆数据的访问时,就必须用长指针(20位)----它靠段值*16(左移4位实现)+偏移--属于跨段访问(1M范围)

在当年的20位的地址长度下,跨段访问(多了段和偏移的复合计算)自然会慢些。

正如1楼所言,这是历史上的一个事实,但时逾境迁,今年已经不是这样的了----内存结构与范围变化、实际的寻址方式运用、多级cache的存在,快慢速度已经无法简单度量了
[解决办法]
我感觉应该是栈快点,由于栈是线程的上下文的一部分,栈所处的那一小块内存应该会常常处于最接近cpu的缓存当中。因为不然会发生很常见的内存抖动(就是反复的操作移出缓存,进入缓存)所以现代操作系统的实现而言很可能吧一个线程的栈内存的某一段固定在内存中不会交换到磁盘上,,另外我们使用的栈对象都是就近原则,一般都是当前函数定义当前函数使用或者进一步的调用的函数使用,所以还是就命中率来说也高点。当然上面的不考虑什么寄存器,仅就确实放置在堆和栈的内存数据来说。
[解决办法]
探讨

C/C++ code

void func(void)
{
int tmp,*ptr=NULL,tmpmid;
ptr=(int *)malloc(sizeof(tmp));
tmp=1;
*ptr=2;
tmpmid=tmp;
tmpmid=*ptr;
free(ptr);
ptr=NULL;
}


看它的汇编代码
Ass……

热点排行