繁体   English   中英

为什么我们需要使用folly :: fbvector而不是std :: vector with allocator最初保留大的uncommited区域?

[英]Why do we need to use folly::fbvector instead of std::vector with allocator which reserve large uncommited area initially?

众所周知,如果我们将push_back元素添加到std::vector<> ,并且如果向量中分配的整个内存被占用,则std::vector<>保留当前内存大小的2倍(分配2X大小的新内存) ,调整向量并将旧数据复制到新内存。

我们可以优化它,Facebook在愚蠢的库中完成这个(FBVector是Facebook的std :: vector的实现。它具有与可重定位类型和jemalloc https://github.com/facebook/folly/一起使用的特殊优化。 blob / master / folly / FBVector.h#L21 )。

即当vector<>没有足够的内存来推送新元素时,我们会分配更多内存但不会分配2倍(不同次数: 1.3 - 1.5倍

说明: https//github.com/facebook/folly/blob/master/folly/docs/FBVector.md

下面的图形解算器显示选择k = 1.5(蓝线)允许在4次重新分配后重复分配存储器,选择k = 1.45(红线)允许在3次重新分配后重复使用存储器,并且选择k = 1.3(黑线)允许仅在2次重用后重复使用重新分配。

在此输入图像描述

但是为什么我们需要使用使用VirtualAllocEx()自定义分配器来使用folly::fbvector<>而不是std::vector<> (如下所示: 我需要使用VirtualAlloc / VirtualAllocEx? ),或者同样在linux https://stackoverflow.com/a/2782910/1558037 ,其中:

  • std::vector<>::reserve() - 最初保留虚拟地址的大型未提交区域(分配WMA,但不在PT中分配任何PTE),例如,最初分配16 GB的虚拟区域,每次缺少内存来提交内存(分配PTE - 分配物理区域)等于1 x SIZE的向量
  • std::vector<>::resize() - 然后只提交一批新的页面,在PT中只分配新的PTE,不重新分配已经使用的内存,也不将数据从旧内存复制到新内存

整体

这种方法的优点是在folly::vector<>有大的未提交区域: 我们总是只分配新的内存部分而不会复制旧数据。

folly::vector<>方法优于std::vector<>的优点: 有时我们不需要分配新内存 ,但应始终将旧数据复制到新内存中。

这是特定于实现的。 GCC库确实分配了两倍,但Visual C ++没有。 我相信,它也使用1.5,但不确定。

我相信, folly应该是与操作系统无关的,你的方法是Windows / Linux特有的。

如果您仔细选择类型,那么从旧向量移动到新向量的对象应该不那么糟糕 - 也就是说,使用std::unique_ptr作为数据类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM