【发布时间】:2018-03-12 09:01:13
【问题描述】:
我想知道使用可变变量是否会导致内存浪费。
考虑以下两个示例,其输出(值a、b 和c)应该相同:
// Example 1
let mutable mut = Map.empty
mut <- mut |> Map.add "A" 0
let fA (m: Map<string,int>) x = m.["A"] + x
let a = fA mut 0 // 0
mut <- mut |> Map.add "B" 1
let fB (m: Map<string,int>) x = m.["A"] + m.["B"] + x
let b = fB mut 0 // 1
mut <- mut |> Map.add "C" 2
let fC (m: Map<string,int>) x = m.["A"] + m.["B"] + m.["C"] + x
let c = fC mut 0 // 3
在Example 1 中,每个函数都接受一个可变参数,并且必须(我认为)复制该参数。
共制作了三份。
// Example 2
let mutable mut = Map.empty
mut <- mut |> Map.add "A" 0
mut <- mut |> Map.add "B" 1
mut <- mut |> Map.add "C" 2
let fA (m: Map<string,int>) x = m.["A"] + x
let fB (m: Map<string,int>) x = m.["A"] + m.["B"] + x
let fC (m: Map<string,int>) x = m.["A"] + m.["B"] + m.["C"] + x
let immut = mut
let a = fA mut 0 // 0
let b = fB mut 0 // 1
let c = fC mut 0 // 3
在Example 2 中,每个函数都会复制相同的不可变参数。
大概编译器足够聪明,在制作这些副本时不会使用任何额外的内存。每个副本可能只是指向原始对象的指针。
因此,即使平均而言,Example 1 中复制的对象小于Example 2 中的不可变对象,Example 2 中将使用更少的内存。
这个推理正确吗?
【问题讨论】:
-
不,没有任何东西被复制。您将引用的可变性与引用指向的数据结构的可变性混淆了。
标签: memory f# immutability mutable