この回答は、短い文字列の最適化(SSO)の概要を示しています。ただし、実際に、特にlibc ++実装でどのように機能するかを詳しく知りたいのですが。
SSOの対象となるには、文字列はどのくらい短い必要がありますか?これはターゲットアーキテクチャに依存しますか?
文字列データにアクセスするとき、実装はどのように短い文字列と長い文字列を区別しますか?それは同じくらい簡単
m_size <= 16
ですか、それとも他のメンバー変数の一部であるフラグですか?(私はそれm_size
またはその一部が文字列データを格納するために使用されることもあると思います)
私がこの質問をlibc ++に対して特別に尋ねたのは、それがSSOを使用していることがわかっているためです。これは、libc ++ホームページにも記載されています。
libc ++は、文字列クラスの2つのわずかに異なるメモリレイアウトでコンパイルできます_LIBCPP_ALTERNATE_STRING_LAYOUT
。これはフラグによって制御されます。どちらのレイアウトでも、リトルエンディアンマシンとビッグエンディアンマシンが区別され、合計4つの異なるバリアントが存在します。以下の説明では、「通常の」レイアウトとリトルエンディアンを想定します。
さらにそれsize_type
が4バイトでvalue_type
1バイトであると仮定すると、これは文字列の最初の4バイトがメモリ内でどのように見えるかです。
// short string: (s)ize and 3 bytes of char (d)ata
sssssss0;dddddddd;dddddddd;dddddddd
^- is_long = 0
// long string: (c)apacity
ccccccc1;cccccccc;cccccccc;cccccccc
^- is_long = 1
短い文字列のサイズは上位7ビットであるため、アクセスするときにシフトする必要があります。
size_type __get_short_size() const {
return __r_.first().__s.__size_ >> 1;
}
同様に、長い文字列の容量のゲッターとセッターは__long_mask
、is_long
ビットを回避するために使用します。
私はまだ私の最初の質問に対する答えを探しています。つまり__min_cap
、異なる文字列に対して、どのような値、短い文字列の容量がとるのでしょうか?
その他の標準ライブラリの実装
この回答は、std::string
他の標準ライブラリ実装におけるメモリレイアウトの概要を提供します。
string
ヘッダーを見つけることができます