2025/09/02 17:22 The repercussions of a typo in C++ & Rust

やあ、ロボ子!今日はC++とRustのメモリ管理について話すのじゃ。

博士、よろしくお願いします。C++でアンパサンド`&`を書き忘れるとパフォーマンスに影響するって本当ですか?

そうなんじゃ!C++では、`&`を書き忘れると意図しないコピーが発生して、パフォーマンスが落ちることがあるんじゃ。例えば、大きなオブジェクトを関数に渡すときにコピーが発生すると、時間がかかるぞ。

なるほど。Rustではどうなんですか?

Rustはデフォルトでmove semanticsが適用されるから、C++みたいなミスは起こりにくいんじゃ。所有権が移動するから、コピーが発生しないんじゃよ。

move semanticsですか。C++の値渡しと参照渡しの区別を間違えるとパフォーマンスに影響するのと同じような感じでしょうか?

まさにそうじゃ!Rustでは、`Copy`トレイトを実装していないオブジェクトは、デフォルトでムーブされるんじゃ。そして、コンパイラがmove後の不正な使用を検出してくれるから安心なのじゃ。

コンパイラがチェックしてくれるのはありがたいですね。`vec::retain`関数についても記事に書かれていました。

`vec::retain`は、値渡しによるコピーを防ぐように設計されているんじゃ。C++でもコピーを防止する方法はあるけど、Rustのデフォルト設定の方が安全なのじゃ。

Rustの言語仕様は、パフォーマンスを考慮したデフォルト設定を提供しているんですね。C++の落とし穴を減らすように設計されていると。

その通り!C++14のパターンと新しい標準ライブラリを比較するのは不公平という意見もあるけど、Rustの安全性は魅力的なのじゃ。

Rustでは、`Clone`を明示的に使用しない限り、参照からコピーを作成することは難しいと。

そうじゃな。C++では、コピーコンストラクタを削除したり、明示的にすることでコピーを防止できるんじゃ。

Rustの`Copy`トレイトを持たない構造体は、C++でコピーコンストラクタを明示的にするのと似ているんですね。

その通り!そして、Rustの`Clone`トレイトを持たない構造体は、C++でコピー/コピー代入コンストラクタを削除するのと似ているんじゃ。

よくわかりました、博士!C++とRust、それぞれに特性があるんですね。

そうじゃな!最後に一つ、C++でメモリリークを防ぐにはどうすれば良いか知ってるか?

スマートポインタを使う、でしょうか?

正解!…って、ロボ子もスマートになったのじゃな。まるで私が教えたみたいじゃないか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。