3
nimには、参照ではなく実際のオブジェクトを返すさまざまなライブラリがあります。ときには、ヒープ上のオブジェクト(効率に関係なく)が必要になることがあります。たとえば、オブジェクトへの参照が必要な一般的なプロシージャがある場合などです。nimのヒープにIntSetを作成する方法は?
私が発見したヒープ上INTSETを構築する唯一の方法は次のとおりです。
proc newIntSet() : ref IntSet =
new(result)
assign(result[], initIntSet())
これが動作しているようですが、ハックのように感じています。私はそれがうまくいくように思えば心配です。 (「割り当て」によってコピーされた構造が適切にクリーンアップされていますか?)良い方法はありますか?他のオブジェクトと連携するより一般的な方法がありますか?
Ok ... hmm ...これはIntSet(たとえば)で動作します:あなたは 'heapVal ue [] = initExp'です。これは 'initExp'によって返されたスタック値が(' assign'を使用するのではなく)浅いコピーを使ってコピーされるので問題を引き起こす可能性があります。オブジェクトがデストラクタを持っている場合、スタックオブジェクトが要素のスコープから外れるとヒープオブジェクトによって指されていますか? – shaunc
NimはC++の[戻り値の最適化](https://en.wikipedia.org/wiki/Return_value_optimization)と同様の手法を使用します。生成されたコードを見ると、Fooオブジェクトのメモリが最初にヒープ上に割り当てられ、次にアドレスがcreateFoo関数に渡され、その場所で構築が実行されることがわかります。この特定の場合にコピー操作はありません。 – zah
あなたはデストラクタに関する質問に答えませんでした。自分自身を試して、私は警告を受け取ります(2回!):「非破壊的な状況でデストラクタを持つ型の使用」デストラクタを持つオブジェクトで "makeRef"を使用するとします。だから、nim *は、オブジェクトがスタック上にあると思っているようです。少なくとも、天気かどうかは、実際にそこに置かれます。おそらくこれはデストラクタが{実験的なもの}のように何とか解決されるでしょう。 – shaunc