为什么具有无用的孤立“静态”的函数被认为是不纯的?

tor*_*gen 4 c++ functional-programming category-theory

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

void f() {
  static int x = 0;
  ++x;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

那么,为什么这种无用的孤立static int会使函数变得不纯?

And*_*hev 7

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

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