标准库设施中分配但不使用分配器的内容

16
在C++标准库分配内存的大多数地方,用户都可以通过提供一个符合Allocator要求的类来自定义内存分配。例如,几乎所有容器都需要一个allocator模板参数,并且std::allocate_shared返回一个shared_ptr,其包含的元素和控制块都是通过提供的Allocator分配的。
然而,在一些可能分配内存但没有提供Allocator支持的地方,我能想到以下几个:
  • std::make_unique()(没有对应的allocate_unique()
  • std::any
  • std::function(C++17将删除allocator支持)
  • std::valarray
  • std::basic_filebuf(尽管std::basic_stringbuf使用了Allocator)
  • std::inplace_merge()
问题:
  • 我相信这个列表不完整,但是还有什么我错过了吗?
  • 在非分配器类和函数中,它们是否指定使用全局 ::operator new、普通 new,还是内存来源未指定?
  • 如果有人知道,为什么不在 any 中提供分配器支持,并将其从 function 中删除呢?

这将是一个很长的列表... - T.C.
1个回答

16

以下并未列出所有情况。

  • <stdexcept> 中的所有内容需要分配内存来存储消息字符串。
  • 标准池/单调内存资源类显然会分配内存,但是它们是从另一个内存资源而不是分配器中进行分配,因此严格来说符合您的描述。
  • boyer_moore_searcherboyer_moore_horspool_searcher
  • 多个 <algorithm> 算法尝试获取额外内存(例如,stable_partitionstable_sort),所有并行算法(无论头文件如何)都可能需要额外内存。
  • 许多 filesystem 库中的内容:
    • path;内部曾经使用默认分配器,但最新草案似乎已将此要求删除,尽管它仍然是意图。
    • directory_iteratorrecursive_directory_iterator
    • 一些可以构造临时 path 的 filesystem 操作。
  • basic_­regex
  • threadasync
  • packaged_task,在 C++17 中取消了对分配器的支持。
  • promise 需要一个地方来存放共享状态。
  • iostreams。
  • 许多内容硬编码使用默认分配器:
    • error_code::message()error_condition::message()error_category::message():这些返回一个 string,因此仅限默认分配器。
    • bitset 的流插入操作概念上使用默认分配器调用 to_string,尽管在实践中没有高质量的实现会这样做。
  • to_stringto_wstring这两个自由函数分别返回std::string/std::wstring,无法指定自己的分配器。显然,对于string的用户自定义字面量(例如"foo"s),也不支持自定义分配器。
  • <locale>中有几个方面具有成员函数,返回std::stringstd::basic_string<charT>,即使用默认分配器(例如numpunct),或仅接受basic_string<charT>(例如money_get)。
  • <random>中的各种类型使用默认分配器的vector

  • 如果有人知道,为什么不提供any的分配器支持,并将其从function中删除的原因是什么?

    any的分配器支持是无法实现的function的分配器支持规范不清,存在问题


    2
    我的天啊,这个答案太棒了。我原以为可能会有两三个我错过的项目,没想到清单这么长!非常感谢您花费心思编制它。 - Tristan Brindle
    1
    值得一提的是,不支持在std::anystd::function中使用分配器的论点实际上似乎是相同的:由于需要从类型擦除的上下文中恢复分配器,所以这是无法实现的。 - cmaster - reinstate monica

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接