- 主题:请问一个有关存储大量小对象的办法,多谢各位大佬
在C++程序中,如果直接new一个尺寸很小的对象,比如5个字节,系统会根据分页规则分配一个比较大的内存,如果大量分配小对象,会造成大量的内存浪费。
有没有办法可以控制内存分配,只分配sizeof大小的内存。
一种变通方法是使用vector,还有更简洁的办法或者开源项目吗?多谢多谢
--
FROM 219.236.40.*
内存池,在池里自己分配
--
FROM 220.249.129.*
好,研究一下,多谢
【 在 ooolinux 的大作中提到: 】
: 内存池,在池里自己分配
--
FROM 219.236.40.*
【 在 coolrocky 的大作中提到: 】
: 在C++程序中,如果直接new一个尺寸很小的对象,比如5个字节,系统会根据分页规则分配一个比较大的内存,如果大量分配小对象,会造成大量的内存浪费。
: 有没有办法可以控制内存分配,只分配sizeof大小的内存。
: 一种变通方法是使用vector,还有更简洁的办法或者开源项目吗?多谢多谢
你的这个理解是不准确的, new是在堆上分配内存,运行时库考虑访问效率, 会做一些对齐,
导致多分配一些内存, 但是, 内存分配时按需提供的, 不会你请求5字节, 就分配你2k,
小内存浪费, 是因为, 每个请求块,也需要在堆上做管理, 所以会有额外的登记管理开销。
随着分配释放的频繁发生, 也可能产生空洞碎块,导致分配效率下降。另外, 堆管理程序优化没那么弱,
它们针对大量的相同字节的重复内存块请求, 也会有类似快表的结果, 就是把相同字节的小块内存,
释放后,放到叫快表的链表里, 有相同请求, 会直接取下返回。
--
FROM 115.171.244.*
std::pmr::memory_resource
【 在 coolrocky 的大作中提到: 】
: 在C++程序中,如果直接new一个尺寸很小的对象,比如5个字节,系统会根据分页规则分配一个比较大的内存,如果大量分配小对象,会造成大量的内存浪费。
: 有没有办法可以控制内存分配,只分配sizeof大小的内存。
: 一种变通方法是使用vector,还有更简洁的办法或者开源项目吗?多谢多谢
--
FROM 45.14.195.*
常数级的改进没啥意义吧
不如多买点内存,或者分布式架构
除非是产品现在的瓶颈就是要降成本提高利润
【 在 coolrocky 的大作中提到: 】
: 在C++程序中,如果直接new一个尺寸很小的对象,比如5个字节,系统会根据分页规则分配一个比较大的内存,如果大量分配小对象,会造成大量的内存浪费。
: 有没有办法可以控制内存分配,只分配sizeof大小的内存。
: 一种变通方法是使用vector,还有更简洁的办法或者开源项目吗?多谢多谢
: ...................
--
FROM 111.201.27.*
多谢回复,可能我的描述不很准确。
是的,当申请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.*