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会使函数变得不纯?
纯函数的结果完全由其输入参数定义。这里的结果不仅指返回值,还指对 C/C++ 标准定义的虚拟机的影响。换句话说,如果函数偶尔表现出具有相同输入参数的未定义行为,则不能将其视为纯行为(因为该行为与具有相同输入的对另一个调用不同)。
在静态局部变量的特殊情况下,如果f在多个线程中同时调用该变量,则该变量可能成为数据竞争的来源。数据竞争意味着未定义的行为。UB 的另一个可能来源是有符号整数溢出,这最终可能会发生。
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |