web-dev-qa-db-ja.com

std :: stringの文字列のサイズをバイト単位で取得します

_std::string_の文字列がメモリに占めるバイト数ではなく、バイト数を取得したいと思います。文字列にマルチバイト文字列が含まれています。 std::string::size()は私のためにこれをしますか?

編集:また、size()には終端のNULLも含まれますか?

21
小太郎

_std::string_はUnicode文字ではなくバイトで動作するため、std::string::size()は実際にデータのサイズをバイト単位で返します(もちろん、_std::string_がデータを格納するために必要なオーバーヘッドはありません) )。

いいえ、_std::string_は、保存するように指示したデータのみを保存します(末尾のNULL文字は必要ありません)。したがって、末尾にNULL文字を含む文字列を明示的に作成しない限り、サイズには含まれません。

25

あなたはそれについて平静である可能性があります:

std::string x("X");

std::cout << x.size() * sizeof(std::string::value_type);

しかし、std :: string :: value_typeはcharであり、sizeof(char)は1として定義されています。

これは、文字列型をtypedefする場合にのみ重要になります(これは、将来変更される可能性があるため、またはコンパイラオプションのために)。

// Some header file:
typedef   std::basic_string<T_CHAR>  T_string;

// Source a million miles away
T_string   x("X");

std::cout << x.size() * sizeof(T_string::value_type);
8
Martin York

std::string::size()は、実際にはバイト単位のサイズです。

5
Will A

文字列が使用しているメモリ量を取得するには、capacity()を管理に使用されるオーバーヘッドと合計する必要があります。これはcapacity()ではなくsize()であることに注意してください。容量は割り当てられた文字(charT)の数を決定し、size()は実際に使用されている文字数を示します。

特に、_std::string_実装は通常、コンテンツを* shrink_to_fit *しないため、文字列を作成し、最後から要素を削除すると、size()はデクリメントされますが、ほとんどの場合(これは実装定義です)capacity()はそうではありません。

一部の実装では、必要なメモリの正確な量を割り当てず、メモリの断片化を減らすために、特定のサイズのブロックを取得する場合があります。文字列に2つのサイズのブロックの累乗を使用した実装では、サイズ_17_の文字列が_32_文字と同じだけ割り当てられる可能性があります。

はい、size()は文字列内のcharの数を示します。マルチバイトエンコーディングの1文字は複数のcharを占めます。

2
AProgrammer

_std::string_は_std::basic_string<char,...>_として定義されています。つまり、その要素タイプはchar(1バイト)ですが、後で「文字列にマルチバイト文字列が含まれています "("マルチバイト "== _wchar_t_?)。

size()メンバー関数は、末尾のnullをカウントしません。その値はバイト数ではなく文字数を表します。

マルチバイト文字列が_std::wstring_(_std::basic_string<wchar_t,...>_のエイリアス)であると想定すると、ヌルターミネーターを含む_std::wstring_の文字のメモリフットプリントは次のようになります。

_std::wstring myString;
 ...
size_t bytesCount = (myString.size() + 1) * sizeof(wchar_t);
_

次のようにstd :: basic_string <>のインスタンス化の可能性がある場合に機能する再利用可能なテンプレート関数をどのように記述するかを検討することは有益です**:

_// Return number of bytes occupied by null-terminated inString.c_str().
template <typename _Elem>
inline size_t stringBytes(const std::basic_string<typename _Elem>& inString, bool bCountNull)
{
   return (inString.size() + (bCountNull ? 1 : 0)) * sizeof(_Elem);
}
_

**簡単にするために、_std::basic_string<>_に明示的に指定されることの少ない特性とアロケータタイプは無視します(デフォルトがあります)。

0
JayRock