产量和静态局部变量的比较

Posted

技术标签:

【中文标题】产量和静态局部变量的比较【英文标题】:Comparison of yield and static local variable 【发布时间】:2013-07-30 10:38:04 【问题描述】:

在阅读 C# 中的 yield 关键字时,让我感到震惊的是,使用在函数内部声明的静态变量似乎有一些相似之处,例如可以在 C 中完成。

两者都是在调用之间保存函数状态的方法,而不会将这一事实暴露在函数之外。

第一个问题:两者在保存函数状态方面有什么区别?

第二个问题:像这样不透明地保存函数状态的设计含义是什么?我已经看到了一些基于产量的“黑客”,这似乎是一场等待发生的灾难。除了可枚举的集合之外,还有其他情况可以从这种设计中受益吗?

【问题讨论】:

我建议一次考虑一种语言。 我会说你看到的相似之处正在扩展它。 @Grijesh 我希望将 C# 与 C 进行比较。C++ 作为 C 的超集也与比较相关。 C++ 不是 C 的超集。 我看不出这个问题的哪一部分值得投反对票,如果投票附有理由会很有帮助 【参考方案1】:

C# yield 看起来很像 Python 中的 yield。如果 因此,它更接近于协同过程而不是静态变量: 保存函数的整个状态。 (回到过去, 我们在英特尔上实现协同进程的方式是交换 带有内存位置的堆栈指针:xchg sp, otherCoprocessStack.)

至于优点,它的重量比 定义一个单独的线程,并通过一些与它通信 一种排队机制。它在以下情况下特别有用 遍历复杂的内存结构,比如树,因为它 避免必须手动维护堆栈。

【讨论】:

以上是关于产量和静态局部变量的比较的主要内容,如果未能解决你的问题,请参考以下文章

lua脚本有静态局部变量吗

java中静态成员变量、实例变量、局部变量何时创建、何时销毁?

C++中的全局变量普通局部变量和静态局部变量的区别

C语言中静态局部变量的问题

成员变量和局部变量,静态变量的区别

java线程安全问题之静态变量实例变量局部变量