在Pure function上的Wikipedia文章中,有一个不纯函数的示例,如下所示:
void f() {
static int x = 0;
++x;
}
带有“由于局部静态变量的突变”。
我想知道为什么它不纯净?它是从单元类型到单元类型的,因此对于相同的输入总是返回相同的结果。而且它没有副作用,因为即使它具有static int
变量,也无法通过此f()
以外的任何其他函数观察到,因此没有其他函数可以使用的可观察到的全局状态突变。
[如果有人辩称不允许任何全局突变,无论它们是否可观察,那么就不能将任何真实函数视为纯函数,因为任何函数都会在堆栈上分配其内存,并且分配是不纯净的,因为它涉及通过OS与MMU进行通信,并且分配的页面可能位于不同的物理页面中,依此类推,依此类推。
所以,为什么这个无用的孤立的static int
使函数不纯?
纯函数的结果完全由输入参数定义。在这里,结果不仅意味着返回值,而且还意味着对C / C ++标准定义的虚拟机的影响。换句话说,如果函数偶尔在某些输入参数下表现出未定义的行为,则不能将其视为纯函数(因为该行为不同于具有相同输入的一个调用对另一个调用的行为)。
在带有静态局部变量的特定情况下,如果在多个线程中同时调用f
,则该变量可能成为数据争用的源。数据竞争意味着未定义的行为。 UB的另一个可能来源是有符号整数溢出,它最终可能会发生。