コピーコンストラクタの悪夢
期間にすれば何年もコードは書いてはいるのですが、C++はいまだに初級レベルを抜けられません・・・。
言語と付き合った時間の問題でなく、書いたコードの量の問題ですね。
C++のコンストラクタと演算子のオーバーロードの機能は、感動ものの素晴らしい機能なのですが。
長年Cでの低レベル処理に慣れた身からすると、コードの上からは見えないことが多く、意外な落とし穴にはまることが多いです。
今回はある処理のボトルネックとなっている箇所で、自作クラスの値をリストから取得して変数に代入していたのですが。夜ふとんに入ってから、ピピッとひらめいて、翌朝、朝一で代入を参照に変更してみました。
すると。
処理が5倍ほど速くなりました。
MyClass mc1 = MyList->GetItem(index)->mc2;
を
MyClass& mc1 = MyList->GetItem(index)->mc2;
'&'を付けただけで、5倍高速化・・・。
だ、脱力・・・。
というのも一昨日前には、丸一日かけてリストからアイテムを取得する処理を最適化して、10倍くらい速くなったのですが。
丸一日かかって、10倍。
'&'つけただけで、5倍。
速くなったことは単純に嬉しいのですが。割り切れない気持ちが・・・
種明かしは、MyClass の '='演算子はオーバーロードされていて、その中で文字列バッファをコピーコンストラクトしていたんですねぇ。
んー、参った。
新たにメモリを割り当てて、文字列をコピーするのはさすがにコストが高いですね。
しかも、その文字列はここの処理では使っていませんでした。
んー、脱力・・・。
んー、っていうか。
こんな技術レベルで演算子オーバーロードしてしまうのが、チャレンジングですかね。