gpt4 book ai didi

c++ - 为什么分配更大的空间时,堆地址的增长方向会相反?

转载 作者:太空狗 更新时间:2023-10-29 23:36:25 24 4
gpt4 key购买 nike

我正在做一些关于堆地址增长的实验,一些有趣的事情发生了。(操作系统:CentOS,)

但是我不明白,为什么会这样?谢谢!

这是我首先做的:

double *ptr[1000];
for (int i=0;i<1000;i++){
ptr[i] = new double[**10000**];
cout << ptr[i] << endl;
}

输出是递增的(最后几行):

....
....
0x2481be0
0x2495470
0x24a8d00
0x24bc590
0x24cfe20
0x24e36b0
0x24f6f40
0x250a7d0
0x251e060

然后我把10000改成了20000:

double *ptr[1000];
for (int i=0;i<1000;i++){
ptr[i] = new double[**20000**];
cout << ptr[i] << endl;
}

地址变得更像堆栈空间的地址(并且是递减的):

....
....
0x7f69c4d8a010
0x7f69c4d62010
0x7f69c4d3a010
0x7f69c4d12010
0x7f69c4cea010
0x7f69c4cc2010
0x7f69c4c9a010
0x7f69c4c72010
0x7f69c4c4a010
0x7f69c4c22010
0x7f69c4bfa010
0x7f69c4bd2010
0x7f69c4baa010
0x7f69c4b82010

最佳答案

不同的环境/实现使用不同的策略分配内存,因此没有一个正确的规则。然而,一种常见的模式是对小对象和大对象使用不同的分配策略。

通常,运行时会有多个堆用于不同大小的对象,这些堆针对不同的使用模式进行了优化。例如,小对象倾向于经常分配并快速删除,而大对象往往很少创建并且具有较长的生命周期。

如果您对所有内容都使用单个堆,那么一些小对象将很快散布在您的内存空间中,留下许多中等大小的 block 可用,但大对象需要很少或根本不需要大块。这称为内存碎片,即使您的应用名义上有大量可用内存,也可能导致分配失败。

使用不同堆的另一个原因是对不同的对象大小使用不同的使用跟踪方法。例如,一个实现可能会为大对象从操作系统请求一个新的内存块,而对于小对象,使用一些较小的操作系统内存块,并由 C 运行时堆管理器处理子分配。对大型对象非常有效的内存使用跟踪机制对于较小的对象可能非常昂贵,因为用于跟踪使用情况的内存占每个对象实际使用内存的很大一部分。

在你的情况下,我的猜测是运行时在内存空间的开头分配小对象,自下而上,在接近尾部的地方分配较大的对象,自上而下,以避免碎片。

关于c++ - 为什么分配更大的空间时,堆地址的增长方向会相反?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com