2016-04-12 11 views
1

それはconst char * + lengthからconst std :: stringを作るのは安いですか?

const std::string s(my_const_char_ptr, my_length); 

を実行するためにどのように高価なのですか?コピーが含まれていますか?そうでない場合は、標準的な標準ライブラリの実装から何命令を受け取ることができますか?パフォーマンスクリティカルなコードでこれを行うには十分ですか?

... GSL実装を取得して、string_viewを使用する必要がありますか?

+0

freestoreからメモリを割り当てるsomewhですほぼすべてのC++実装では高価です。それ以外に、あなたの質問はとてもあいまいで、おそらくあなたが期待できる最も正確な答えは次のとおりです。 – IInspectable

+0

はい、コピーがあります。そして、このような操作がどれだけ多くの「命令」で使用されるかを単に表現する方法はありません。あなたは単にあなたのコードを分解して見る必要があります。 –

+1

コンストラクタは(my_lengthが十分に小さく、実装が小さな文字列の最適化を実行しない限り)ヒープ割り当てを行い、文字データをコピーします。 –

答えて

4

それは

const std::string s(my_const_char_ptr, my_length); 

を実行するためにどのように高価なのですか?

これはメモリ割り当て(おそらくmy_lengthが大きい場合はダイナミック)+ O(n)コピーです。正確に知りたい場合は、ターゲットシステムとコンパイル設定で測定する必要があります。

コピーが含まれていますか?

はい。文字はstd::stringの内部バッファにコピーする必要があります。標準テーブルごと

1

basic_string(const charT*, size_type, const Allocator&)効果

data():最初の要素[...]

Sによって指し示されているアレイの割り当てられたコピーの最初の要素を指し

したがって、割り当てにはO(N)個のコピーがあります。ここでNは関数に渡されるサイズです。

2

実行するために、それはどのように高価である...あなたが一度

それをすればかなり安い

?コピーが含まれていますか?

はい、それはあなたの心配です。線形コピーは、現代建築でできる最も安いものです。 (パイプライン、プリフェッチなどのため)

一般的な標準ライブラリの実装からいくつの命令を実行できますか?

特にコピー部分では、実装(-O2で構築)は、できるだけ大きな単語を一度にループアンロール、ベクトル化、転送することを目指します。メモリアライメントは実際にパフォーマンスの最大のアービターになります。

これは性能重視のコードでは十分ではありませんか?

それはパフォーマンスが重要なのです場合は、文字列を事前に割り当てて、それを再使用(それはあなたを殺すでしょうメモリの割り当てです。ここでも、コピービットは、チップと同じくらい安いです。std::string::assign(first, last)を参照してくださいので、一度それを行います。

...または私はGSLの実装を取得し、string_viewを使用する必要があります?

ない文字列が絶対的に巨大でない限り。

+0

文字列が短い(128B以下のような)限り、コピーは安いです。タイトなループで起こっている場合、ターゲットバッファはすでにL1キャッシュでホットになっています。それはそれを行う指示があるので、コピーを避けることはまだ明らかに良いです。ループが大きくてOPが単に 'const char * 'を使ってループを変更することはできないのであれば、命令/ uopのスループットにボトルネックではないということは十分にあるでしょう(例えばIntel SnBファミリの4 1クロックあたりのパイプライン幅)、コピー待ち時間/スループットの影響はほとんど隠されています。 –

関連する問題