C++で文字列クラスをコーディングしているとします(ライブラリを使用できることがわかります)。ストリングの長さは可変であり、ストレージスペースはコンストラクターで動的に割り当てられ、デストラクタで解放されます。 main
関数(a,b,c
が文字列である)c=a+b
を呼び出すときに、operator+
メンバ関数は、連結された文字列a+b
を格納する一時的なオブジェクトを作成main
機能に戻し、その後operator=
メンバ関数は元々c
に格納された文字列を解放するために呼び出されますテンポラリ文字列a+b
からc
にデータをコピーし、最後にテンポラリa+b
を破棄します。これを実現するための方法があるかどう値で返されるのではなく、C++でスワップを返すことは可能ですか?
私は思ったんだけど:代わりにc
へa+b
からoperator=
コピーデータを有するので、私は、それがa+b
とc
のデータポインタを交換したいようa+b
が破壊されたときに、それをc
(元のデータ)に元のデータが破棄されますが、c
は今度はa+b
の結果をコピーする必要はありません。
2パラメータのメンバ関数setToStrcat
をコーディングし、c.setToStrcat(a,b)
を呼び出すことができます。たとえば、関数を符号化することができる。
void String::setToStrcat(const String& a,const String& b){
String tmp(a.len+b.len); int i,j;
for(i=0;i<a.len;i++) tmp[i]=a[i];
for(j=0;j<b.len;i++,j++) tmp[i]=b[j];
tmp[i]='\0'; this->swap(tmp);
}
void String::swap(String& a){
int n=len; len=a.len; a.len=n;
char *s=str; str=a.str; a.str=s;
}
は私のコンストラクタの定義を省略(i
番目の文字の参照を返す)とoperator[]
(len+1
char型のスペースを割り当てています)。 tmp
がスワップ後破壊されたとき、それが実際に破壊されている元々*this
(main
関数でString c
)に格納されたデータとなるようswap
関数は、*this
とtmp
間のデータポインタと長さ変数をスワップ。 *this
は現在(c.str
)の連結文字列a+b
です。
c=a+b
のパフォーマンスを同じレベルに最適化する方法があるかどうかを知りたいと思います。私はc.swap(a+b)
を試して、a+b
の戻り値の型をString&
に変更しましたが、警告(ローカル変数への参照)が表示され、GDBはスワップが発生する前に一時的に破壊されたことを示します。
私の質問は一般的だと思います。 C++プログラミングでは、関数の結果を格納するために一時オブジェクトが必要なことがよくありますが、main関数の別のオブジェクトに割り当てると、データをコピーすることはできませんが、代わりに(もっと速く)ポインタのスワップを使用できますか?これを実現させるためのきちんとした方法は何ですか?
移動のセマンティクスを検索します。具体的には、コンストラクタを移動して代入演算子を移動します。 – Rakete1111
まだ移動のセマンティクスについて聞いたことがありませんか? [お読みください。](https://www.google.com/search?q = c%2B%2B + move + semantics) – user2357112
あなたは[copy elision]のように見えます(http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value最適化)。 C++では、C++以降に保証されます。 – Sergey