3

とにかく更新すると「コピー」されるので混乱しますが、私が理解していることから、ほとんどの場合、ポインターをコピーするだけで、ある種のディープコピーを作成することはありません。スポーンすると、ある種の完全なコピーが作成されますか? 変更しない場合はどうなりますか?

4

1 に答える 1

5

はい、スポーンするときに、スポーンされた関数に渡されるすべての用語を新しいプロセスのヒープにコピーする必要があります。

リストまたは辞書を更新する場合、変更されていない要素はコピーされません。これは、これらへのポインターが同じヒープにあり、新しい用語に使用できるためです。次の例を検討してください。

A = [1,2,3],
B = [0|A].

この場合、B用語の場合、最初の要素が用語0で、2 番目の要素がリストの最初のコンス セルへのポインターである 1 つのコンス セルのヒープにメモリを割り当てる必要がありAます。リストはA同じヒープにあります。

生成すると、新しいプロセスには独自のヒープがあるため、使用するすべてのデータをそこにコピーする必要があります。

生成されたプロセスが大規模なデータ構造のすべての要素にアクセスしない場合は、生成する前に関連データを抽出するか、ETS テーブルを使用するのが理にかなっています (ETS テーブルを渡す場合、テーブル参照のみが渡されますが、変更またはアクセスする要素をコピーインまたはコピーアウトします)。

于 2012-08-09T08:53:36.310 に答える