0

文字列を関数に渡すとき(たとえば、ベクトルに挿入するとき)、以下のコードに#1、#2、および#3の間に違いがあるかどうか疑問に思いました。特に、コード内の何百万もの文字列を処理する場合。

std::vector<std::string> v;
std::string s("foo");
int i = 1;
v.push_back( s + "bar" + boost::lexical_cast<std::string>(i) );  // #1
v.push_back( std::string(s + "bar" + boost::lexical_cast<std::string>(i)) );  // #2
std::string s2 = s + "bar" + boost::lexical_cast<std::string>(i);
v.push_back(s2);  // #3
4

2 に答える 2

1

適切なオプティマイザを使用すれば、#1と#2の間に違いはないはずですが、#1は、コンパイラが実際に一時的な除去を行う可能性が最も高くなります。

ただし、#3には名前付きの一時的なものが含まれているため、それが一時的なものであることを検出するには、おそらく優れたオプティマイザーが必要です。

于 2012-09-25T21:53:17.170 に答える
1

おそらくそうではありません。それらは同等でなければなりません。

ただし、パフォーマンスを向上させる1つの方法は、文字列を事前に割り当てることです。

std::string s;
s.reserve(10); // or so...
s.append("foobar").append(lexical_cast<std::string>(i));

ただし、ここでは、面倒な価値を実現するのに十分なパフォーマンスが得られない可能性があります。

于 2012-09-25T21:54:17.840 に答える