内存分配中的函数式编程案例

时间:2013-10-18 21:49:15

标签: c memory-management functional-programming

我一直在阅读有关函数式编程的内容,我对在某些运行情况下对程序的一些影响感到好奇。

对于我目前的情况,我在C(双精度数组)中有一个向量,我经常在计算中使用这个向量,我想要一个“返回向量”,但我不想分配额外的内存,所以我使用了诸如

之类的签名
void compute(vector* input, vector* output);

我在相同的输入向量上使用别名来保存输出而不必为新的输出向量分配额外的内存。

现在进行函数式编程,我的经验仅限于Mathematica编程语言和一些常见的lisp,但我很好奇它的效果。假设我有一个向量v,我用函数式语言编写相同的计算。在Mathematica中,我会发表声明:

v = compute(v)

在其他标准函数式语言中,从我对阅读的理解是这些对象是不可变的,因此v不应该改变,并且v将被重新分配为新的向量,解除分配旧向量。我想知道我的理解是否准确,如果没有,会发生什么而不是我的误解。我知道懒惰的评估,并且还想知道在使用和不使用延迟评估的情况下这些系统会有什么不同。

谢谢。

编辑1:被问及我来自哪里的具体情况。我正在研究的一个项目是光线跟踪器,通常情况下我需要请求光照的矢量信息或者那种效果,这些数据通过传递给函数的指针存储,目标存储矢量是在函数外部分配。我对函数式编程的理解是什么,并且作为评论已经发布,当我做类似的事情时,由于向量是不可变的,我不能传递指向这个函数的指针来修改向量,而是函数将返回新分配的向量:

v = compute(v)

v将是一个新分配的向量。我最初的问题是这个索赔的准确性,并且正如有人发表支持这一主张的那样,我的下一个问题不会被视为浪费记忆的可能点吗?

1 个答案:

答案 0 :(得分:0)

本文对不可变的函数编程范式中涉及的数据结构编程进行了很好的描述

http://www.infoq.com/articles/in-depth-look-clojure-collections

C的问题在于你真的需要很多纪律来使用不可变的概念。话虽这么说,一些方案虚拟机是用C语言实现的。(注意方案不是一成不变的。但是函数是真的)