可変変数を使用するとメモリが浪費されるのではないかと思います。変数として変数を渡すとメモリが浪費されますか?
はその出力(値a
、b
、及びc
)が同一でなければならない、次の2つの例を考える:Example 1
で
// 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
各関数が可変引数を取り、(私は推測)コピーを作成する必要がありますその議論の が合計3部作成されます。
// 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
では少ないメモリが使用されます。
この理由は正しいですか?
いいえ、何も今までにコピーされません。リファレンスが指し示すデータ構造の変更可能性とリファレンスの変更を混同しています。 –