我一直在阅读函数式编程,我很好奇在某些运行情况下对程序的影响。
对于我目前的情况,我在 C 中有一个 vector ( double 组),我经常在计算中使用这个 vector ,我想要一个“返回 vector ”,但我不想分配额外的内存,所以我使用了一个签名,比如
void compute(vector* input, vector* output);
我在同一输入 vector 上使用别名来保存输出,而无需为新的输出 vector 分配额外的内存。
现在对于函数式编程,我的经验仅限于 Mathematica 编程语言和一些普通的 lisp,但我很好奇这会产生什么效果。假设我有一个 vector v,我用函数式语言编写相同的计算程序。在 Mathematica 中,我会声明:
v = compute(v)
在其他标准函数式语言中,根据我的阅读理解,这些对象是不可变的,因此 v 不应更改,并且 v 将被重新分配为新 vector ,释放旧 vector 。我想知道我的理解是否准确,如果不正确,我的误解会发生什么。我知道惰性求值,也想知道这些系统在使用和不使用惰性求值的情况下会有何不同。
谢谢。
编辑 1:询问我来自哪里的具体情况。我正在从事的一个项目是光线追踪器,在这种情况下,我经常需要为照明或类似效果请求 vector 信息,该数据通过传递给函数的指针存储,目标存储 vector 是在函数外分配。我对函数式编程的理解是,正如评论所发表的那样,当我做类似的事情时,由于 vector 是不可变的,所以我不能将指针传递给这个函数来修改 vector ,而是函数会返回一个新分配的 vector :
v = 计算(v)
而 v 将是一个新分配的 vector 。我最初的问题是这个说法的准确性,正如有人发帖支持这个说法,我的下一个问题是这不会被认为是一个可能的内存浪费点吗?
最佳答案
这篇文章很好地描述了不可变函数式编程范式中涉及的数据结构编程
http://www.infoq.com/articles/in-depth-look-clojure-collections
C 的问题在于您确实需要大量的纪律才能使用不可变的概念。话虽如此,一些方案虚拟机是用 C 实现的。(请注意,方案不是一成不变的。但是功能性的)
关于c - 内存分配中的函数式编程案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19459571/