tag:blogger.com,1999:blog-3636872937372639901.post551375087461222614..comments2024-03-29T16:37:25.385+09:00Comments on 本の虫: C++11のstd::swapはC++03のstd::swapとは互換性がない江添亮http://www.blogger.com/profile/13387122818743087721noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-3636872937372639901.post-26469751148403150352012-03-24T16:43:26.155+09:002012-03-24T16:43:26.155+09:00そういえばそうだ。
やはり自前のスワップは必要かな。そういえばそうだ。<br />やはり自前のスワップは必要かな。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-51671833722616326802012-03-24T08:20:55.168+09:002012-03-24T08:20:55.168+09:00X x1(10);
X x2(10);
x1 = x2; // #1
ムーブ代入演算子でstd::...X x1(10);<br />X x2(10);<br />x1 = x2; // #1<br /><br />ムーブ代入演算子でstd::swap( *this, t ) ;を呼び出すと、swap内部でムーブ代入演算子がまた呼び出されるので、、#1で無限ループに落ちるのでは?Jessenoreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-3432210151623545542012-03-23T15:34:05.406+09:002012-03-23T15:34:05.406+09:00ムーブ後のオブジェクトがすぐに破棄されるならば、結果的には全く同じ事です。
代入演算子でswapを使...ムーブ後のオブジェクトがすぐに破棄されるならば、結果的には全く同じ事です。<br />代入演算子でswapを使うと、ムーブ後のオブジェクトは、ムーブ先で確保されたストレージを所有することになるので、<br />その後普通に使うこともできます。<br /><br />swapを使うと、ストレージの破棄を必要になるまで遅らせることができるのです。江添亮https://www.blogger.com/profile/13387122818743087721noreply@blogger.comtag:blogger.com,1999:blog-3636872937372639901.post-49217929986667148212012-03-23T15:06:10.673+09:002012-03-23T15:06:10.673+09:00パフォーマンス的に以下はどうでしょうか?
通常は、std::swapでmoveされているため、del...パフォーマンス的に以下はどうでしょうか?<br />通常は、std::swapでmoveされているため、delete [] ptr;がno-opになるので、std::swapを使うより早いと思います。<br /><br />X& operator=(X&& t)<br />{<br /> assert(*this != &t);<br /> delete [] ptr; // no-op<br /> size = t.size;<br /> ptr = t.ptr;<br /> t.size = 0;<br /> t.ptr = nullptr;<br /> return *this;<br />}Jessenoreply@blogger.com