-
MACRO RUBY_TYPED_EMBEDDABLE -
rb_data_type_tのflagsに指定するフラグです。 Ruby 3.3 で追加され、4.1 で公開 API として文書化されました。 [feature#21853] Ruby は C の構造体をmallocで別に確保せず、オブジェクトのスロットに直接埋め込むことがあります。ポインタをたどる回数やmallocの負荷が減り、場合によってはメモリ使用量も減ります。ただし保証ではなく、構造体がスロットに収まらないときなどは埋め込まれません。埋め込み可能にするには次の制限を守る必要があります。
- 構造体へのポインタや構造体の内部を指すポインタを保持してはいけません。GC のコンパクションで無効になります。オブジェクトがスタック上にある間だけ、渡して使えます。C 側で生成したオブジェクトは
RB_GC_GUARDで保護してください (Ruby から引数として渡されたオブジェクトなら不要です)。 - DATA_PTR、
RTYPEDDATA_DATA、TypedData_Wrap_Structは使えません (TypedData_Wrap_StructはTypeErrorになります)。RTYPEDDATA_GET_DATAかTypedData_Get_Structを使います。 dfreeで構造体そのものを free してはいけません。RUBY_DEFAULT_FREEは指定できます。RUBY_TYPED_FREE_IMMEDIATELYも指定する必要があります (指定がないとTypeErrorになります)。
構造体の大きさが可変のときは、
TypedData_Make_Structの代わりにrb_data_typed_object_zallocを使えます。