问题描述
当定义一个没有事先为该向量预留/分配内存的向量,并通过push_back()填充该向量时,该向量的总内存分配占用空间(如我在Xcode Instruments所观察到的)最终会比向量本身的内容。
这是一个问题,因为我正在创建大量这样的向量。有一次我知道向量将保持不变,我想知道是否存在一种方法可以“修剪”分配给向量的超出其实际大小的内存。
我知道已经做了过多的分配来创建缓冲区,并最大程度地减小了如果向量增长到已经占用的内存中就不得不重新定位向量的风险(对吗?)。但是,正如我所说,我知道有关的向量将保持不变。
问题:我有一个向量V
。从某种意义上说,我知道向量将保持不变。因此,我希望在V
周围“修剪”“内存分配占用空间”,以消除多余的保留内存,从而最大程度地减少内存碎片。能做到吗?
我希望有这样的东西
V.finalise(); // * Does not exist *
V.prune(); // * Does not exist *
我尝试过“黑客”之类的
vector<T> VC // VC will be used to "copy-out" results from inner scope
{
vector<T> V = f(); //f() builds V gradually via push_back(),no constructor used inside f()
VC{V} // Constructor-copy a "clean and tight" new vector copy of V
} // Destroy "messy" V leaving scope and keep a clean VC
或
vector<T> V = f();
vector<T> VC{V}
V.erase(); // Destroy "messy" V and keep a clean VC
似乎都不起作用:在所有后续代码中,与在函数f()中创建V相关的多余分配都将保留。
跟进问题:即使在我的测试运行中,多余的分配仍然存在,我想如果需要的话,可以为同一进程(即运行)回收该内存。程序)。正确吗?
感谢您对此新手到内存分配问题的解答。
编辑/更新
std::vector<T>::shrink_to_fit() // c+11
按照以下答案之一进行工作:https://stackoverflow.com/a/1111311/11608725到本问题的重复(reduce the capacity of an stl vector)。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)