通常の C++ 文字列内の文字シーケンスを事前に割り当てて初期化する方法を知りたいです。質問の機会は、Windows レジストリに値を照会することです。コード例については、この回答を参照してください。問題は、システム コールが、呼び出し元によって割り当てられた配列に書き込まれることです。割り当てられたバッファで差し迫った問題を既に解決しましたが、この解決策には無関係な文字列のコピーと思われるものがあります。これにより、余分な操作をどのように排除できるかについて、ライブラリの作成者を対象とした一般的な質問に興味を持ちました。
のコンストラクターにstd::basic_string
は、これを行う明白な方法は含まれていません。std::unique_ptr
多くの点で、ポインターの背後にある割り当てを内部ストレージとして吸収する引数を持つ文字列コンストラクターが必要です。私はこのサンプルコードのようなものを考えています:
size_t len;
// ... Determine len
std::string::allocator_type a = std::string::allocator_type();
std::unique_ptr< char_t[] > p( a.allocate( len ) );
// ... Copy characters to p
std::string s( p, len, a ); // constant-time constructor
そのようなコンストラクターがないため、これは機能しません。問題は、そのようなコンストラクターをどのように実装するかについてです。
allocate
関数が事前に割り当てられたストレージを返し、一度だけそうするカスタムアロケーターを定義するのが正しい方法のようです。おそらく、このクラス自体はジェネリックであり、文字列アロケータでインスタンス化されます (例のように)。これは機能するように思えますが、そのアプローチのすべての影響を理解しているわけではありません。