任何范围视图适配器类型(来自“std::views”)是否依赖于堆分配?

Quu*_*one 5 c++ stl standard-library c++20 c++26

我知道至少大多数Ranges 视图类型不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组并通过管道将其通过,std::views::take(42)而不会导致任何堆分配。

但我知道有很多模糊的视图适配器,例如,,,views::join每年都会有更多的视图适配器出现,仅仅因为今天大多数视图适配器显然不分配(在常见情况下)并不意味着所有视图适配器永远不会分配。views::istreamviews::chunk_by

通过类比:我知道大多数标准库算法不需要任何堆分配。例如,您可以在堆栈上获取一个 C 数组,并且std::ranges::partition不会引起任何堆分配。但有一些算法(std::inplace_mergestd::stable_sortstd::stable_partition;及其std::ranges对应算法)确实执行运行时堆分配。我们已经有一个 SO 问题跟踪哪些算法堆分配。

因此,我要求一个最新的答案(甚至可能在将来维护/更新):在任何主要 STL 供应商的实现上,是否有任何std::views::适配器需要堆分配?如果有,是哪些以及为什么?

T.C*_*.C. 1

当前标准库中或预计为 C++26 建议的视图(请参阅 P2760)不需要自行分配内存。

  • generator当然可以分配给协程机制(仅展示unique_ptr<stack<coroutine_handle<>>>成员不会出现在任何高质量的实现中)
  • 许多视图需要保存用户提供的对象,这些对象本身可以动态分配内存(例如,single_view<vector<string>>.

any_view- 如果要提议的话 - 会的。