std::string
文字数ではなく、aの文字列がメモリ内で占めるバイト数を取得したいと思います。文字列にはマルチバイト文字列が含まれています。私のためにこれをしますかstd::string::size()
?
編集:また、size()
終了も含まれていますNULL
か?
std::string
Unicode文字ではなくバイトで動作するため、std::string::size()
実際にデータのサイズをバイト単位で返します(std::string
もちろん、データを格納するために必要なオーバーヘッドはありません)。
いいえ、std::string
保存するように指示したデータのみを保存します(末尾の文字は必要ありませんNULL
)。したがって、末尾の文字を含む文字列を明示的に作成しない限り、サイズには含まれませんNULL
。
あなたはそれについて衒学者である可能性があります:
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);
std::string::size()
確かにバイト単位のサイズです。
文字列によって使用されているメモリの量を取得するには、capacity()
を管理に使用されるオーバーヘッドと合計する必要があります。capacity()
であり、ではないことに注意してくださいsize()
。charT
容量は、割り当てられる文字数()を決定し、size()
実際に使用されている文字数を示します。
特に、std::string
実装は通常、コンテンツを* shrink_to_fit *しないため、文字列を作成してから要素を最後から削除すると、size()
がデクリメントされますが、ほとんどの場合(これは実装で定義されています)はデクリメントされcapacity()
ません。
一部の実装では、必要なメモリの正確な量を割り当てない場合がありますが、メモリの断片化を減らすために、指定されたサイズのブロックを取得します。文字列に2つのサイズのブロックの累乗を使用する実装では、サイズのある文字列が文字と同じ数17
を割り当てる可能性があります32
。
はい、size()はchar
文字列内の数を示します。マルチバイトエンコーディングの1文字は、複数を占めますchar
。
書かれている質問には固有の矛盾があります: std::string
は-として定義されています。std::basic_string<char,...>
つまり、その要素タイプはchar
(1バイト)ですが、後で「文字列にマルチバイト文字列が含まれています」(「マルチバイト」== wchar_t
?)と述べました。
メンバー関数は、末尾のsize()
nullをカウントしません。この値は、文字数(バイト数ではない)を表します。
std::wstring
マルチバイト文字列が(のエイリアス)であると言うつもりだったとすると、nullターミネータを含むの文字の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<>
(デフォルトがあります)。