2011-08-13 17 views
5

私は最初のC++アプリケーションを構築し、この段階で信頼できる効率的なC++ライブラリを選択するプロセスを進めていますが、これは私が検討している設計上の考慮事項の1つです。どちらが効率的か、itoaかsprintfですか?

私は整数型を文字列に変換して使用するかどうかを決めたいと思います。

sprintf(string, "%d", x); 

それとも

整数

itoa(x, string); 

をASCIする誰もがこれらのルートの一つが効率的であり、おそらく理由でお勧めできますか?

ありがとうございました。

+5

'istringstream'または' boost :: lexical_cast'についてはどうですか?結局のところC++だ。 – pmr

+3

整数の書式設定は本当にアプリケーションのボトルネックになりますか? –

+1

@Kerrek SBこの段階では少しずつ数えます。 – Bitmap

答えて

10

これらのいずれも使用しないでください。 std::stringstreamなどを使用してください。

std::stringstream ss; 
ss << x; 
ss.str(); // Access the std::string 

いずれにしても、文字列に変換することはアプリケーションの実行時間のかなりの部分になることはほとんどありません。

+0

Downvoter:コメントしますか? –

+0

それは私ではありませんが、この回答は元の質問に答えることができないため、下院の投票があると思います。 – legends2k

+1

'stringstream'は非常に遅いですが、これはいくつかのアプリケーション(HFT取引など)では重要な部分であり、既存の' char * 'バッファーに変換することもできません。 – javapowered

14

両方とも効率的です。 itoa()はC++標準の一部ではなく、多くの一般的なランタイムでは利用できません。 (特に、libstdc++の一部ではないため、Mac OS XやLinuxでは利用できません)

0

純粋なアルゴリズムの観点からは、sprintfがフォーマット記述子ストリングを解析する追加コストを有するので、itoaがより高速であると主張することができる。しかし、実装での2つの機能のコストをベンチマークすることなく、軽微な作業負荷で、確かなことはありません。

また、両方の機能が同等でないため、これはリンゴの比較にリンゴではありません。 sprintfは、前者が標準関数であり、後者が標準関数ではないことを除けば、itoaよりもはるかに多くの書式設定を行うことができます。別に

あなたがC++ 11を使用することができます場合は、あなたのstd::string返しto_stringを使用することができます。小数以外の表現が必要な場合は、次のようにしてください:

int i = 1234; 
std::stringstream ss; 
ss << std::hex << i;  // hexadecimal 
ss << std::oct << i;  // octal 
ss << std::dec << i;  // decimal 

std::bitset<sizeof(int) * std::numeric_limits<unsigned char>::digits> b(i); 
ss << b;     // binary 

std::string str = ss.str(); 
関連する問題