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

标签 c++ c++20 coroutine

我一直在学习 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局部变量意味着你实际上有一个实例......总共。而每个生成器都是完全独立的。

// 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);
因此,您可以想象,如果您想要创建一个生成器,它可以为您提供无限的整数流,那么如果您可以在整个程序中可靠地使用该函数超过一次,那就太好了。
这并不是说静态局部变量没有用。只是它们不适用于这个特定的用例。

关于c++ - 协程和带有静态变量的函数有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67340908/

相关文章:

c++ - Linux 编程接口(interface)中的信号处理程序示例

c++ - 使用 cout 的双重表示

python-3.x - Python 3 中还有协程吗?

asynchronous - Kotlin 中的延迟函数内部是如何工作的?

python - 协程从 send() 而不是 next() 开始运行

C++ - 无法从函数返回 vector

c++ visual studio 2008 链接问题

c++ - 分区模块是否由主模块接口(interface)单元输出?

c++ - 当 C++14 已经有泛型 lambda 时,在 C++20 中引入模板 lambda 的需要是什么?

c++ - 理解 c++20 的用户定义字符串文字加法