2
C ++の偽のコピー操作を見つける方法は?
最近、私は次のことをしました struct data { std::vector<int> V; }; data get_vector(int n) { std::vector<int> V(n,0); return {V}; } このコードの問題は、構造体が作成されるときにコピーが発生し、解決策は代わりにreturn {std :: move(V)}を書き込むことです。 このような偽のコピー操作を検出するリンターまたはコードアナライザーはありますか?cppcheck、cpplint、clang-tidyのいずれも実行できません。 編集:私の質問を明確にするためのいくつかのポイント: コンパイラエクスプローラを使用したためにコピー操作が発生し、memcpyへの呼び出しが表示されることがわかっています。 コピー操作が発生したことは、標準のyesを確認することで確認できました。しかし、私の最初の間違った考えは、コンパイラーがこのコピーを最適化するというものでした。私は間違っていた。 clangとgccの両方がmemcpyを生成するコードを生成するため、これは(おそらく)コンパイラーの問題ではありません。 memcpyは安いかもしれませんが、メモリをコピーしてオリジナルを削除する方がstd :: moveでポインタを渡すよりも安い状況は想像できません。 std :: moveの追加は基本的な操作です。コードアナライザーがこの修正を提案できると思います。