2012-03-30 9 views
3

マップの内容をソケット経由で送信する文字列に効率的に変換しようとしています。私はこれまでこれを持っています...バッファにC++で追加する

これは動作している間、私はそれが非効率的かどうか疑問に思っていました。 int/long/doubleを文字列に変換する最も効率的な方法をGoogleが検索し、sprintfという結果になったので、私はそれを使用しています。しかし、私はバッファの内容が何度も何度もコピーされていくのではないかと心配していますが、最後に追加したいだけです。これは正しいのでしょうか?もしそうなら、これを行う良い方法がありますか?パフォーマンスとスピードは#1優先です。

ありがとうございます!

+0

バッファを自分自身にコピーするために '%s 'を使用していますか?それは*醜いです*と私はそれがうまく動作します。 –

答えて

5

正しいですか。ここで提案したソリューションは毎回バッファをコピーします。より良くするには、sprintfの戻り値を使用する必要があります。バッファの残りの長さを追跡し、私はsnprintfを使用し、方法によって、ということ

char buffer[1024]; 
char* end_of_buffer = buffer; 
std::size_t remaining_space = sizeof(buffer); 

for (auto iter = my_map.begin(); iter != my_map.end(); iter++) 
{ 
    int written_bytes = snprintf(end_of_buffer, remaining_space, "|%ld|%d", iter->first, iter->second); 

    if (written_bytes > 0) { 
     end_of_buffer += written_bytes; 
     remaining_space -= written_bytes; 
    } else { 
     perror("Something is wrong with the buffer"); 
    } 
} 

お知らせ。 常には、安全でないバージョンの代わりにこれを使用してください。あなたのアプリケーションは進化し​​、偉大な創造性をもってには、このバッファーをオーバーフローさせるための方法があります。その一方で、安全性はゼロになります。

+0

私は答えを調べ、すべての異なる方法をテストしました。 各メソッドは10,000,000回実行されました。 (私は落とし穴であることを学んだことに加えて) 私のオリジナルの方法は取っ:35.96秒 ストリーム方式は取っ: アンドレスメソッドがかかった30.27秒:私は今のストリームを使用します 27.98秒を、私は意志間違いなくアンドレスの方法に切り替えてください。 ありがとう! – Joshua

+1

"私は間違いなく後に切り替える"はほとんど現実世界で起こらない。今すぐ切り替えるか、現在の選択が無期限にとどまることができて幸いであるかどうかを確認してください。 – Steve314

+0

@スティーブS314は言った。私がクリティカルパスにいるか、フィールド幅をコントロールしていない限り、私もストリングストリームを好む。その選択は完全に正当なものになる可能性があります。 –

5

あなたはstd::ostringstream Sを使用する必要があり、彼らは効率的でより多くのC++だ - ISH:その後

#include <sstream> 

std::ostringstream oss; 
for (iter = my_mapy.begin(); iter != my_map.end();iter++) 
{ 
    oss << iter->first << "|" << iter->second; 
    //oss.str() returns the string in which everything was stored. 
} 

、あなたはまだostringstreamの最後にものを追加するoperator<<を使用することができます。

+2

+1 - 潜在的なバッファオーバーフローの問題も取り除きます。 – Steve314

+0

それは私の元々の考えでしたが、私が読んだほとんどすべての記事は、ストリームが遅くても安全だと言っていました。私のバッファは決して1024以上にはならないので、私はそれを心配していません。 – Joshua

+0

このコードは*効率的である必要がありますか?ストリングストリームは、sprintfを使用するよりも10〜15%遅くなる可能性があります。私はとにかくこのアプローチのために行くだろう。 – mfontanini

0

代わりにstringstreamを使用するべきですが、効率を上げたい場合は、ストレートchar *をバッファに使用できると思いますが、1024を超えないとわからない限り、バッファを増やす必要がありますバイト。

+0

これは私の元々の考えでしたが、私が読んだほとんどすべての記事は、ストリームが遅くても安全だと言っていました。私のバッファは決して1024以上にはならないので、私はそれを心配していません。 – Joshua

+0

はい、彼らは速くなることはありませんが、はるかに遅くなくてはなりません。 –

2

バッファをsprintfに入力と出力の両方として渡しました。それは未定義の動作です。

+0

-1は正しいが、役に立たない。 –

+0

@AndresJaanTack:実際には、質問は「これは正解ですか、もしそうなら...?」だから、それは正解で有益な答えです。 – KillianDS

関連する問題