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

问题描述 投票:0回答:1

我知道至少大多数范围视图类型不需要任何堆分配。例如,您可以在堆栈上获取一个 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++ stl c++20 standard-library c++26
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.