- 主题:请问一个有关存储大量小对象的办法,多谢各位大佬
在C++程序中,如果直接new一个尺寸很小的对象,比如5个字节,系统会根据分页规则分配一个比较大的内存,如果大量分配小对象,会造成大量的内存浪费。
有没有办法可以控制内存分配,只分配sizeof大小的内存。
一种变通方法是使用vector,还有更简洁的办法或者开源项目吗?多谢多谢
--
FROM 219.236.40.*
好,研究一下,多谢
【 在 ooolinux 的大作中提到: 】
: 内存池,在池里自己分配
--
FROM 219.236.40.*
多谢回复,可能我的描述不很准确。
是的,当申请5个字节时,系统不会直接分配一个page,但是缺省的分配策略比较大颗粒度,比如windows上面(64位),申请1-15字节,会分配16字节,对于大量的小对象是不能容忍的。申请1M个1字节的小对象,会占用16M内存。如果使用vector,则会占用1M内存。
在前面的大佬说过,可以使用内存池,比如mimalloc, tcmalloc,jemalloc等,可以支持小颗粒度的分配,减少内存占用。
【 在 poggy 的大作中提到: 】
: 你的这个理解是不准确的, new是在堆上分配内存,运行时库考虑访问效率, 会做一些对齐,
: 导致多分配一些内存, 但是, 内存分配时按需提供的, 不会你请求5字节, 就分配你2k,
: 小内存浪费, 是因为, 每个请求块,也需要在堆上做管理, 所以会有额外的登记管理开销。
: ...................
--
FROM 219.236.40.*
多谢,研究一下。
【 在 mvtec 的大作中提到: 】
: std::pmr::memory_resource
--
FROM 219.236.40.*
是的,vector底层对内存的管理处理很好。
【 在 ylh0315 的大作中提到: 】
: vector挺方便的。
--
FROM 219.236.40.*