我知道至少大多数范围视图类型不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组并通过管道将其传输到
std::views::take(42)
,而不会导致任何堆分配。
但我知道有很多晦涩的视图适配器,例如
views::join
、views::istream
、views::chunk_by
,每年都会有更多,仅仅因为大多数视图适配器今天显然没有分配(在常见情况下)并不意味着所有视图适配器将永远不会分配。
通过类比:我知道大多数标准库算法不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组并对其进行
std::ranges::partition
操作,而不会导致任何堆分配。但有一些算法(std::inplace_merge
、std::stable_sort
、std::stable_partition
;及其对应的 std::ranges
)do 执行运行时堆分配。 我们已经有一个 SO 问题跟踪哪些算法堆分配。
因此,我要求提供最新的答案(甚至可能在将来维护/更新):任何
std::views::
适配器是否需要堆分配,在任何主要STL供应商的实现上?如果有,是哪些以及为什么?
当前标准库中或预计为 C++26 提议的视图(请参阅 P2760)不需要自行分配内存。
generator
当然可以分配给协程机制(仅限博览会的unique_ptr<stack<coroutine_handle<>>>
成员不会出现在任何高质量的实现中)single_view<vector<string>>
。any_view
- 如果要提议的话 - 会的。