使用 std::views::join 是否存在基本的性能成本?

Mar*_*rkB 6 c++ performance gcc c++20 std-ranges

我最近一直在对范围和视图进行一些性能评估。我发布了一个简单的示例(也在https://www.godbolt.org/z/7ThxjKafc),其中汇编的差异比我预期的要显着得多。使用最新的 GCC 和 -O3,

  • 的汇编sum_array包含 31 条指令和 8 个跳转。
  • 的汇编sum_vec包含 12 条指令和 2 个跳转。

鉴于 的大小m_array在编译时已知,我预计这两个函数的汇编几乎相同。我是否应该期望优化编译器在未来版本中得到改进,或者在如何std::views::join指定方面是否存在一些基本限制?

#include <array>
#include <vector>
#include <ranges>

struct Foo {
    auto join() const { return m_array | std::views::join; }
    auto direct() const { return std::views::all(m_array[0]); }
    std::array<std::vector<int*>, 1> m_array;
};
__attribute__((noinline)) int sum_array(const Foo& foo)
{
    int result = 0;
    for (int* val : foo.join())
        result += *val;
    return result;
}
__attribute__((noinline)) int sum_vec(const Foo& foo)
{
    int result = 0;
    for (int* val : foo.direct())
        result += *val;
    return result;
}
Run Code Online (Sandbox Code Playgroud)