Move Semantics

最近Reactive Extensionsなどで、C++を使うことが増えたことで、&&(ユニバーサル参照)を見かけたことから、ムーブセマンティクスについて興味を持ったため調べてみました。
「ReactiveX / RxCpp」
https://decode.red/net/archives/1053
C++を最初に使ったのはかなり前(まだMicrosoftのコンパイラが対応する前)でしたが、今のC++は当時の面影がないほど記法が変化しており、最近も3年ごとにアップデートされていて、ちょっと目を離すと、使わない機能などは読解が困難になるほどです。難易度が高い言語ですが、機能が豊富で実戦(いろんな意味で)では強いというメリットもあることから、最近見直しています。その一環としてムーブセマンティクス、ムーブコンストラクタといわれるものを試してみました。
所有権の移動は、最近Blockchainのブログでも触れましたが、このジャンルで重要な考え方なので興味を持ちました。
「Move / Aptos」
http://bitlife.me/bc/2022/10/23/

C++の記法は、柔軟であるゆえ複雑になる傾向があるので、まずは参考サイトのコードを自分なりにアレンジして動かしてみました。

環境)
https://wandbox.org/

参考)
https://cpprefjp.github.io/lang/cpp11/rvalue_ref_and_move_semantics.html
https://theolizer.com/cpp-school2/cpp-school2-13/#std_forward
https://marycore.jp/prog/cpp/move-constructor/

所有権を移動しただけでは、アドレスが変わらない、というテストです。ただし16文字より少ないと変化します。これは参考サイトにもありますが、SSO(Small-string optimization)によるもので、性能劣化はしないとのことです。
main関数の最初の3行は、左辺値参照と右辺値参照は、このような書き方しかできないという例です。

cは、aと意味は同じですが、記法の確認のためと、移動したことの確認のため追加しました。

参考サイトでも使われていてはじめて知ったのですが、Wandbox、便利です。

About

Categories: 未分類 タグ: