Skip to content

duk_compact()

1.0.0 property object memory

プロトタイプ

c
void duk_compact(duk_context *ctx, duk_idx_t obj_idx);

スタック

(バリュースタックに影響なし。)

要約

オブジェクトの内部メモリ割り当てをリサイズし、メモリ使用量を最小にします。obj_idx の値がオブジェクトでない場合は、何もしない。コンパクションは通常安全であるが、内部エラー(メモリ不足エラーなど)により失敗することがあります。コンパクションは、オブジェクトの「自身のプロパティ」にのみ影響し、継承されたプロパティには影響しません。

コンパクションは最終的な操作ではなく、オブジェクトのセマンティクスに影響を与えることはありません。オブジェクトに新しいプロパティを追加することは可能ですが(オブジェクトが拡張可能であることが前提)、オブジェクトのサイズ変更が発生します。既存のプロパティ値は、オブジェクトの内部メモリ割り当てに影響を与えることなく変更することができます(プロパティが書き込み可能であると仮定して)。オブジェクトは複数回コンパクト化できます。例えば、以前にコンパクト化したオブジェクトに新しいプロパティを追加する場合、プロパティ追加後のメモリフットプリントを最小にするために、オブジェクトを再度コンパクト化することができます。

オブジェクトをコンパクトにすると、オブジェクトごとにわずかな量のメモリを節約することができます。一般的には、(1) メモリフットプリントが非常に重要な場合、(2) オブジェクトに新しいプロパティが追加される可能性が低い場合、(3) オブジェクトが比較的長寿命の場合、そして (4) 大きな違いを生むほど多くのオブジェクトに圧縮を適用できる場合に有効です。

Object.seal()、Object.freeze()、Object.preventExtensions()が呼ばれた場合、オブジェクトは自動的に圧縮されます。

c
duk_push_object(ctx);                           /* [ ... obj ] */
duk_push_int(ctx, 42);                          /* [ ... obj 42 ] */
duk_put_prop_string(ctx, -2, "meaningOfLife");  /* [ ... obj ] */
duk_compact(ctx, -1);                           /* [ ... obj ] */