协程和带有静态变量的函数有什么区别?

我一直在学习 C++20 中的新功能,并试图了解共同讨论的共同例程的“生成器”用例。我试图在这里创建一个小例子,但如果有错误,我深表歉意:

generator<int> Generate() {
    int i = 0;
    while(1) {
        co_yield i++;
    }
}

int main()
{
    auto gen { Generate() };
    for (int x = 0; x < 10; ++x) {
        gen.next();
        std::cout << gen.getValue() << std::endl;
    }
    return 0;
}

但是我看不出这与具有静态变量的函数有何不同,例如:

auto gen() {
    static int i = 0;
    return i++;
}

int main()
{
    for (int x = 0; x < 10; ++x)
        std::cout << gen() << std::endl;
    return 0;
}

我想我可能会看到异步 I/O 是一个用例,尤其是使用co_await关键字,但是对于这个生成器示例,我确信我对它们应该如何使用有一些误解。我将非常感谢任何解释

回答

也许最明显的区别是static局部变量意味着您实际上拥有一个实例... total。而每个生成器是完全独立的。

// with coroutines
assert(Generator().next() == 0);
assert(Generator().next() == 0);
assert(Generator().next() == 0);
assert(Generator().next() == 0);

每次调用都Generator()在创建一个新的生成器,每个生成器从 开始计数0。所以每一个新的发电机next()给我零。正如预期的那样。

但静态局部变量不是这种情况:

assert(gen() == 0);
assert(gen() == 1);
assert(gen() == 2);
assert(gen() == 3);

所以你可以想象一下,如果你想要创建一个生成器来为你提供无限的整数流,那么如果你可以在整个程序中可靠地使用该函数超过一次,那就太好了。

这并不是说静态局部变量没有用。只是它们不适用于此特定用例。

  • Lambdas, on the otherhand, `[i = 0]() mutable -> int { return ++i; }`

以上是协程和带有静态变量的函数有什么区别?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>