在关于 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/