linux malloc大小限制,linux-malloc / realloc /空闲容量优化

如果您有一个动态分配的缓冲区,它在运行时以无法预测的方式(例如向量或字符串)改变其大小,则优化分配的一种方法是仅以2的幂(或其他一些边界/阈值),并保留多余的空间.这有助于分摊寻找新的可用内存和复制数据的成本,但要花一点额外的内存.例如,许多C stl容器的接口规范(保留vs调整大小vs trim)都考虑了这种方案.

我的问题是,Linux 3.0 x86_64,GLIBC 2.13,GCC 4.6(Ubuntu 11.10)上的malloc / realloc / free内存管理器的默认实现是否有这样的优化?

void* p = malloc(N);

... // time passes, stuff happens

void* q = realloc(p,M);

换句话说,对于N和M的哪个值(或在其他情况下),p == q?

解决方法:

首先,如果内存是通过mmap()而非sbrk()获得的,那么glibc malloc会针对大型请求执行此操作,默认情况下,IIRC大于等于128 kB:

if (chunk_is_mmapped(oldp))

{

void* newmem;

#if HAVE_MREMAP

newp = mremap_chunk(oldp, nb);

if(newp) return chunk2mem(newp);

#endif

/* Note the extra SIZE_SZ overhead. */

if(oldsize - SIZE_SZ >= nb) return oldmem; /* do nothing */

/* Must alloc, copy, free. */

newmem = public_mALLOc(bytes);

if (newmem == 0) return 0; /* propagate failure */

MALLOC_COPY(newmem, oldmem, oldsize - 2*SIZE_SZ);

munmap_chunk(oldp);

return newmem;

}

(Linux具有mremap(),因此实际上就是这样做的).

对于较小的请求,我们在下面几行

newp = _int_realloc(ar_ptr, oldp, oldsize, nb);

_int_realloc在此处要复制粘贴有点大,但是您会在上面链接的第4221行开始找到它. AFAICS,它不会像C std :: vector可以,但是可以精确地分配用户请求的数量(四舍五入到下一个块边界对齐内容,依此类推).

我想这个想法是,如果用户希望此大小增加2的因子(或任何其他常数因子的增加,以确保多次调整大小时的对数效率),则用户可以自己在C库.

标签:memory,gcc,glibc,allocation,linux

来源: https://codeday.me/bug/20191201/2083529.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值