c++ - 为什么具有无用的隔离 `static` 的函数被认为是不纯的?

标签 c++ functional-programming category-theory

在关于 Pure function 的维基百科文章中,有这样一个不纯函数的例子:

void f() {
  static int x = 0;
  ++x;
}

附注“因为局部静态变量的突变”。

我想知道为什么它不纯?它从单元类型到单元类型,因此对于相同的输入,它总是返回相同的结果。而且它没有副作用,因为尽管它有 static int变量,除此之外的任何其他函数都无法观察到它f() ,因此没有可观察到的其他函数可能使用的全局状态突变。

如果有人争辩说不允许任何全局突变,无论它们是否可观察,那么现实生活中的任何函数都不能被认为是纯函数,因为任何函数都会在堆栈上分配其内存,而分配是不纯的,因为它涉及与MMU 通过操作系统,并且分配的页面可能驻留在不同的物理页面中,依此类推。

那么,为什么这个无用的孤立static int使函数不纯?

最佳答案

纯函数的结果完全由其输入参数定义。这里的结果不仅指返回值,还指对 C/C++ 标准定义的虚拟机的影响。换句话说,如果函数偶尔表现出具有相同输入参数的未定义行为,则不能将其视为纯行为(因为该行为与具有相同输入的对另一个调用不同)。

在静态局部变量的特殊情况下,如果 f,该变量可能成为数据竞争的来源。在多个线程中并发调用。数据竞争意味着未定义的行为。 UB 的另一个可能来源是有符号整数溢出,这最终可能会发生。

关于c++ - 为什么具有无用的隔离 `static` 的函数被认为是不纯的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60552309/

相关文章:

c++ - void * 指针中的引用问题?

c++ - 加速一个短到 float 的转换?

list - 方案:将列表映射为函数的参数

covariance - 有人可以解释类型协方差/逆变和范畴论之间的联系吗?

c++ - 如何在 C++ 中从标准输入获取变量输入

c++ - 将阴影添加到视差遮挡贴图

Scala:在修改序列时迭代它?

haskell - 为什么我的 haskell 程序内存不足?

haskell - `arr fst` 是如何自然转换的?

list - Codetity与 `DList`和 `[]`之间的关系