为什么将无用的孤立的“静态”函数视为不纯?

问题描述 投票:2回答:1

Pure function上的Wikipedia文章中,有一个不纯函数的示例,如下所示:

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

带有“由于局部静态变量的突变”。

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

[如果有人辩称不允许任何全局突变,无论它们是否可观察,那么就不能将任何真实函数视为纯函数,因为任何函数都会在堆栈上分配其内存,并且分配是不纯净的,因为它涉及通过OS与MMU进行通信,并且分配的页面可能位于不同的物理页面中,依此类推,依此类推。

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

c++ functional-programming category-theory
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.