1

これについては我慢してください...

既存の構造体があるとします:

<cfset struct1 = {key1 = "foo", key2 = "bar"}>

...いくつかのキーと値のペアを追加したい。典型的なアプローチは次のようなものです。

<cfset struct1.key3 = "baz">
<cfset struct1.key4 = "qux">
<cfset struct1.key5 = "quux">

または、structAppend() を使用することもできます。

<cfset struct2 = {key3 = "baz", key4 = "qux", key5 = "quux"}>
<cfset structAppend(struct1, struct2, false)>

...これには、既存のキーを上書きするかどうかを制御できるという追加のボーナスがあります。欠点は、新しいキーと値のペアが 2 つの異なる場所に存在することになるため、より多くのメモリを使用することだと思います。しかし、代わりにこれを行うとどうなりますか:

<cfset structAppend(struct1, {key3 = "baz", key4 = "qux", key5 = "quux"})>

余分なメモリ使用量を排除しましたか? または、2 番目のパラメーターの構造体は、関数が実行された後も秘密の場所に存在し続けますか? その場合、アクセスすることさえできない冗長なキー/値のセットでメモリを浪費しています。

私の主な関心事はメモリの使用量ですが、最後のアプローチに最初のアプローチと比較して、処理オーバーヘッドなどの他の欠点があるかどうかを知ることはおそらく害にはならないでしょう。そして、私が提示したどの方法でもリソース使用量の違いは、単一の実行シナリオでは重要ではないことを認識しています。私は、大量のデータおよび/または多くの繰り返しを使用して、より大きなスケールで考えています。

それが重要な場合、私は現在CF 9.0.1を使用しています。

4

1 に答える 1

1

ええ、暗黙の構造体は、次の GC がクリーンアップする必要があると判断するまで、メモリ内に残ります。structAppend()ただし、どちらの例でも同じように作成されます。唯一の違いは、struct2インラインで実行すると参照が作成されないことです。

リクエストの途中で GC が発生した場合、インライン バージョンはクリーンアップされる候補になると思われます。これは、インライン バージョンを使用している参照が暗黙的にゼロになるためです。一方、名前を付けると、参照が存在します。すぐそこにあり、参照自体が破棄されるリクエストの終了後まで、GC で使用できません。

于 2013-09-09T08:10:02.573 に答える