Libc における短い文字列の最適化の詳細
libc では、メモリ フットプリントを最小限に抑え、パフォーマンスを向上させるために短い文字列の最適化 (SSO) が採用されています。短い文字列の場合。この記事では、libc での SSO 実装の基本を掘り下げて、その仕組みを明確にします。
SSO 適格性の基準
SSO 適格性の長さのしきい値はターゲットによって異なります。建築。 32 ビット マシンの場合、SSO は最大 10 文字の文字列に対して有効ですが、64 ビット マシンの場合、最大 22 文字の文字列まで拡張されます。これは、文字列クラスのメモリ レイアウト、具体的には、個別の割り当てを必要とせずにデータ ストレージに利用できる割り当てスペースによって決まります。
短い文字列と長い文字列の区別
Libc は、文字列サイズを格納するメンバー変数内のフラグを使用して、短い文字列と長い文字列を区別します。短い文字列の場合、このフラグは 0 に設定され、サイズ フィールドにサイズが直接含まれていることを示します。長い文字列の場合、フラグは 1 に設定され、サイズ フィールドは無効になり、__long_mask を使用してフラグを回避します。
短い文字列と長い文字列のデータへのアクセス
短い文字列の場合、is_long フラグに対応するためにサイズ フィールドを 1 シフトすることでサイズを取得できます。対照的に、長い文字列は別のメンバー変数を使用して容量を保存し、__long_mask を使用して is_long ビットを回避するゲッターとセッターを介してアクセスします。
短い文字列の容量
__min_cap によって決定される短い文字列の容量は、利用可能なメモリ サイズと割り当てられたワード サイズに基づいて計算されます。 32 ビット マシンでは、容量は 10 文字ですが、64 ビット マシンでは 22 文字です。これにより、外部割り当てを必要とせずに、短い文字列が使用可能なメモリを完全に利用できるようになります。
代替文字列レイアウト
Libc には、構成可能なオプション LIBCPP_ABI_ALTERNATE_STRING_LAYOUT が用意されています。長い文字列構造体のメンバー変数を再配置します。これは、構造体の先頭に __data を配置して位置合わせを改善することでパフォーマンスを向上させることを目的としています。ただし、これは実験的な機能であり、ABI の互換性に関する懸念があるため、注意して使用する必要があります。
以上がLibc の短い文字列最適化 (SSO) はどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。