他の答えは、過負荷が1つしかないことを示唆しています operator =(String rhs)
価値で議論をするが、これはそうです いいえ 最も効率的な実装。
この例では、DavidRodríguez -Dribeasによる事実です
String f();
String a;
a = f(); // with String& operator=(String)
コピーは作成されていません。ただし、ただ仮定します operator =(String rhs)
提供され、この例を考慮してください。
String a("Hello"), b("World");
a = b;
何が起こるかです
b
にコピーされます rhs
(メモリ割り当て + memcpy
);
a
と rhs
交換されます。
rhs
破壊されます。
実装する場合 operator =(const String& rhs)
と operator =(String&& rhs)
次に、ターゲットの長さがソースよりも大きい場合のステップ1のメモリ割り当てを回避できます。たとえば、これは単純な実装です(完璧ではありません:より良い場合があります String
持っていた capacity
メンバー):
String& operator=(const String& rhs) {
if (len < rhs.len) {
String tmp(rhs);
swap(tmp);
else {
len = rhs.len;
memcpy(data, rhs.data, len);
data[len] = 0;
}
return *this;
}
String& operator =(String&& rhs) {
swap(rhs);
}
パフォーマンスポイントに加えて swap
は noexcept
, 、 それから operator =(String&&)
可能です noexcept
同じように。 (メモリの割り当てが「潜在的に」実行されている場合はそうではありません。)
この優れた詳細をご覧ください 説明 ハワード・ヒナントによる。