2

私は現在、Winsockを介してデータを送受信するためのcスタイルの配列としてベクトルを使用しています。

std :: vectorがあり、それを「バイト配列」として使用しています。

問題は、送信ごとに1つ、受信ごとに1つ、合計2つのベクトルを使用していることですが、私が行っていることはかなり非効率的です。

例:

std::string EndBody("\r\n.\r\n");
std::fill(m_SendBuffer.begin(),m_SendBuffer.end(),0);
std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin());
SendData();

SendDataは、sendを適切な回数だけ呼び出すだけで、すべてが正常に機能することを保証します。

ともかく。毎回使用する前にベクトルをゼロにしない限り、エラーが発生し、内容が重複します。私がしていることを行うためのより効率的な方法はありますか?各呼び出しでバッファ全体をゼロにすることはひどく非効率的であるように思われるからです。

ありがとう。

4

4 に答える 4

1

m_SendBuffer.clear() を使用できます

そうしないと、 end() メソッドはバッファの実際のサイズを認識できません。

clear() は、呼び出すのに非常にコストのかかるメソッドではありません。486 などに取り組んでいる場合を除き、パフォーマンスに影響することはありません。

于 2009-03-07T08:20:33.287 に答える
1

他のポスターは、バッファをクリアするコスト、またはバッファのサイズに注目しているようです。それでも、実際に行っていることのために、バッファー全体をクリアまたはゼロにする必要はなく、そのサイズを知る必要もありません。「重複するエラー」はSendDataの問題であり、コードを投稿していません。おそらく、SendData は、バッファ内のデータがゼロで終了していない限り、送信する必要があるバッファの量を認識していません。その仮定が正しければ、データを正しくゼロ終端するだけです。

std::copy(EndBody.begin(),EndBody.end(),m_SendBuffer.begin());
m_SendBuffer[EndBody.size()] = 0;
SendData();
于 2009-03-11T16:06:23.087 に答える
0

STL docsを理解している限り、clear を呼び出すと、.end() の値が .begin() と同じに設定され、サイズがゼロに設定されます。これは瞬時です。

割り当てられたメモリの量やメモリの場所は変更されません (どのイテレータも明らかに無効になりますが、データが残る傾向があります!)。.capacity() は変更されず、そこに保存されているデータも変更されません。これは、既に発見したとおりです。常に .begin() .end() および STL イテレータを使用して領域にアクセスしている場合、これは問題になりません。

クラスのメソッド変数は、初期化リストに含めない限り初期化されないことを忘れないでください。そこに追加m_SendBuffer(BUFSIZE,0)するとうまくいくかもしれません。

于 2009-03-11T13:42:45.927 に答える
0

clear を呼び出すことは、ベクトルが新しいサイズの 0 を取得することを意味しませんか? OP がベクトルをメモリの大きなチャンクとして使用している場合は、クリア後に resize を呼び出して、send と recv の呼び出しに適切なスペースを確保する必要があります。

ベクトルで clear を呼び出してから resize を呼び出すことは、ゼロで埋めることとほぼ同じではないでしょうか?

ベクトル::クリア

ベクトル::サイズ変更

塗りつぶし

于 2009-03-07T08:24:55.320 に答える