2011-08-05 12 views
0

cの私は、バイナリバッファオブジェクトが必要な場合は、TCP/UDPの通信に使用されるような

は、私はCで、それを何がベースになり++?バイナリ通信用のバッファ、++

  • vector<unsigned char>

  • std::string? - std :: stringは一般的な考え方とは逆に0バイトを保持できるので、バイナリデータを保持するために使用できます。

  • new char[]

  • malloc()

誰でもstd :: vectorがバイナリバッファに使用されていますか?
私は見ませんでした。どうして ?パフォーマンス?

そして、バイナリバッファによく使用されるmalloc()が見えました。
C++の場合。誰でも確認できますか?説明する?

おかげ

+0

私は、あなたが何をどのように使用したいのかと、それをどのように使いたいかによって決まると思われます。 – forsvarir

+0

ベクトルを使用する Arunmu

+0

ブーストAsioはバイナリデータを格納するためにcharのベクトルを使用/推奨しています。だから私はそれがパフォーマンスの問題を与えてはならないと思います。 – Arunmu

答えて

6

バイナリバッファは、ちょうどあなたには、いくつかの非構造化情報を格納するために予約メモリの一部として見ることができます。 この意味では、新しいchar[]mallocは完全に同等ですが、IMOはメモリとポインタを提供します。

std::vectorを使用することは別の問題です。あなたはmallocとするだろうように根本的なバッファにアクセスするために

&vect[0] 

を使用するので、別に私は考えていない、コスト、より関連性がある、それはよりバッファの拡張性とより多くのアクセスの安全性と同様に、その利点を持っていますストレートポインタ。 discussion hereが表示されます。私は自分自身でプロジェクトでそれらを使用しました。

std::string Sは、原理的にはC++の問題を抱えている(98、03)基本となるバッファの連続性を保証する標準ではありませんが、これはコンパイラの実装の問題ではないようです。 C++ 0xは標準化されたバッファ連続性を持っているようです(しかし、私はそれを特に検索しませんでした)。だから、あなたもそれらを使用することができますが、Herb Sutter's comment hereの前に読んでください(それは主要記事本体にはありませんが、最後に3番目のコメントに投稿されています)。

とにかく、std::stringstd::vectorの間では、std::vectorを選択します。

0

プログラムの仕組みによって異なります。クライアントかサーバーですか?固定長のリクエストを送受信しますか?後でデータを変更する必要がありますか?あなたは文字列として操作したいのですか?

私はstd :: stringを使用したいと思います。しかし、あなたが見ることができるように、それは最適ではありません。

1

newmallocの違いは、newがメモリを割り当てるエンティティのコンストラクタ(存在する場合)を呼び出すことです。しかし、charは基本型であるため、newまたはmallocは、charにコンストラクタがないため、違いはありません。同じことは約deletefreeと言うことができます。

char* buf = new char[100]; 
また

のような構文を使用するように、割り当てられたバッファを解放するとき、覚えておいてください:

私は個人的に文字を使用します*バッファ(チャーは、メモリ内の1バイトである)

delete[] buf; 
アレイ otherwise you will have memory leaksを削除するには

を入力してください。

ので、私は 個人 std::stringまたは std::vectorを使用していないだろう

:文字の単純な配列が

  • 以上のstdのいくつかの実装があります(「ユニバーサル」が、私には速いようだ

    • バイトの配列は常に同じになります)
    • これは理解しやすく、デバッグしやすいかもしれません。

    HTH、
    JP

  • +0

    ニックピックするには、整数型とその配列(デフォルトは0)を値で構築できるので、 'new char [100]()'は、アレイ。しかし、このサポートは現時点では異なる場合があります。また、 'new'は*式*であり、' malloc() 'は* function *です。 –

    +0

    それについてのあなたのポイントは議論の余地があります。速度の差はごくわずかですが、リソースの有効範囲と型の安全性が向上します。私は配列を扱うことの認知的負担がスピード "利益"(もしあれば)の価値があるとは言いません。 – Pablo

    +0

    @Kerrek SB:貴重な情報ありがとう:) –