标准库中有一些明显的部分会在堆上进行内存分配,例如std::string
、std::vector
、std::list
和std::map
。其他部分有时可能会以不太明显的方式“意外地”分配内存,例如std::function
。
除了字符串和容器之外,标准库的哪些部分可能会导致在堆上进行内存分配?我主要关心的是非明显的情况。
标准库中有一些明显的部分会在堆上进行内存分配,例如std::string
、std::vector
、std::list
和std::map
。其他部分有时可能会以不太明显的方式“意外地”分配内存,例如std::function
。
除了字符串和容器之外,标准库的哪些部分可能会导致在堆上进行内存分配?我主要关心的是非明显的情况。
在C++标准库中,没有明确的分界线来区分哪些部分一定会分配内存,哪些部分一定不会。有一些特定情况下,标准明确禁止类型或函数进行动态分配(例如optional
和variant
被明确禁止使用动态分配实现)。有一些特定情况下,如果没有明确要求,则期望实现执行动态分配(任何明确指定能够抛出std::bad_alloc
的内容)。
但除了这些情况之外,你无法确定。除了明确禁止的情况之外,对于其他事情,你必须依赖于实现质量。
std::stable_partition
明显是几个例外之一。 - Mooing Duck
std::stable_partition
- Jarod42std::function
)必须使用动态分配。算法很可能会使用分配。除了极少数情况外,基本上没有保证某些东西不会动态分配,但对于许多东西来说,任何合理的实现都是显而易见的。 - user17732522std::swap
可能会分配内存,需要创建临时对象,但实际上并不需要。这是出于好奇还是因为您有什么想法,不能允许动态分配? - NathanOliverstd::swap
could allocate" 才会分配内存。基于移动的交换不需要分配内存,只有基于复制的交换才需要。 - Remy Lebeau