协程和带有静态变量的函数有什么区别?
What's the difference between a coroutine and a function with static variables?
我一直在学习 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++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);
所以您可以想象,如果您想要创建一个生成器来为您提供无限的整数流,那么如果您可以在整个程序中可靠地使用该函数超过一次,那就太好了。
这并不是说静态局部变量没有用。只是它们不适用于这个特定的用例。