Cスタイルの文字列は、必要に応じていつでも変換できstd::string
ます。実際、プロファイリングからの観察結果は、単に割り当ての数ではなく、データの断片化によるものである可能性が高く、std::string
オンデマンドでの作成が効率的です。もちろん、実際のアプリケーションがわからない場合、これは単なる推測であり、とにかくテストされるまで、実際にはこれを知ることはできません。クラスを想像します
class my_class {
std::string data() const { return self._data; }
const char* data_as_c_str() const // In case you really need it!
{ return self._data; }
private:
int _type;
char _data[1];
};
データレイアウトに標準の巧妙なCトリックを使用したことに注意_data
してください。ファクトリ関数が余分なスペースを割り当てている限り、必要な長さです。IIRC、C99はそれのために特別な構文さえ与えました:
struct my_struct {
int type;
char data[];
};
これは、C++コンパイラで動作する可能性が高いです。(これはC ++ 11標準ですか?)
もちろん、これを行う場合は、すべてのコンストラクターをプライベートにしてファクトリ関数と友達にする必要があります。これにより、ファクトリ関数が実際にインスタンス化する唯一の方法にmy_class
なります。配列。必ずoperator=
プライベートにするか、慎重に実装する必要があります。
データ型を再考することはおそらく良い考えです。
たとえば、実行できることの1つは、char
配列を構造化データ型にしようとするのではなく、代わりにスマート参照を使用することです。次のようなクラス
class structured_data_reference {
public:
structured_data_reference(const char *data):_data(data) {}
std::string get_first_field() const {
// Do something interesting with _data to get the first field
}
private:
const char *_data;
};
他のコンストラクターや代入演算子でも正しいことをしたいと思うでしょう(おそらく代入を無効にし、移動とコピーに適したものを実装します)。std::shared_ptr
また、裸のポインターではなく、コード全体で参照カウントされたポインター(例)が必要な場合があります。
可能な別のハックは、を使用することですstd::string
が、タイプ情報を最初のエントリ(または最初のいくつか)に格納します。もちろん、これには、データにアクセスするたびにそれを考慮する必要があります。