除了容器之外,C++标准库的哪些部分可能会导致内存分配?

3

标准库中有一些明显的部分会在堆上进行内存分配,例如std::stringstd::vectorstd::liststd::map。其他部分有时可能会以不太明显的方式“意外地”分配内存,例如std::function

除了字符串和容器之外,标准库的哪些部分可能会导致在堆上进行内存分配?我主要关心的是非明显的情况。


1
所有类型擦除的内容(例如std::function)必须使用动态分配。算法很可能会使用分配。除了极少数情况外,基本上没有保证某些东西不会动态分配,但对于许多东西来说,任何合理的实现都是显而易见的。 - user17732522
std::swap 可能会分配内存,需要创建临时对象,但实际上并不需要。这是出于好奇还是因为您有什么想法,不能允许动态分配? - NathanOliver
1
@NathanOliver:主要是出于好奇心。但我也与一个软件一起工作,我们试图避免分配(在初始启动后)以避免内存碎片和昂贵的分配(这是实时系统)。但我们在这里谈论的小分配真的不是问题。 - arghol
只有在被交换的类型不支持移动语义时,@NathanOliver "std::swap could allocate" 才会分配内存。基于移动的交换不需要分配内存,只有基于复制的交换才需要。 - Remy Lebeau
1个回答

4

在C++标准库中,没有明确的分界线来区分哪些部分一定会分配内存,哪些部分一定不会。有一些特定情况下,标准明确禁止类型或函数进行动态分配(例如optionalvariant被明确禁止使用动态分配实现)。有一些特定情况下,如果没有明确要求,则期望实现执行动态分配(任何明确指定能够抛出std::bad_alloc的内容)。

但除了这些情况之外,你无法确定。除了明确禁止的情况之外,对于其他事情,你必须依赖于实现质量。


1
通常,大多数可以分配内存的东西都有一个接受分配器的重载版本,或者允许复制具有内部分配的数据。然而,std::stable_partition 明显是几个例外之一。 - Mooing Duck

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