2016-06-28 8 views
0

私はそれを提供するバッファに1つ以上のメッセージのリストを返すネットワークAPIを使用しています。典型的なバッファは、復帰時に次のようになります。メモリブロックの割り当て

|B|message 1|S|message 2|S|message 3|E|

| B |開始を示す文字です。| S | | E |はセパレータである。終わりです。メッセージの長さと数はさまざまです。私がしたいのは、このバッファーを一度トラバースし、それを(この場合は)3つのコンポーネントメッセージに分割し、それぞれのメッセージを処理するコードにstd::unique_ptr<char*>のようなコードを送り、そのunique_ptrがメモリ。しかし、私は彼らのバッファからこれらのメッセージを小さなものにコピーすることなく、そうしたいと思います。

バッファを新しい小さなヒープブロックに細かく割り当てることができますが、それでも自動クリーンアップのメリットがありますか?

+1

新しいプレースメントの検索。 –

答えて

3

少なくとも割り当てメカニズム(ヒープ)のほとんどの実装では、バッファの「サブ割り当て」はありません。

単純な解決策として、共有バッファ全体へのポインタと、見つかったメッセージのポインタ(またはオフセット)とサイズを使用することをお勧めします。

つまり、このようなものです。

struct MsgPtr 
{ 
    shared_ptr<Buffer> m_Buf; 
    char* m_pMsg; 
    size_t m_nMsgSize; 
}; 

長い間、解析されたメッセージをメモリに保存するつもりがない場合は、これは問題ありません。

+0

これは良いアイデアです。それをさらに進めて、shared_ptrのコンストラクタフォーム(8)が私の必要とするだけのものかどうか疑問に思います。 http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr –

関連する問題