yohhoyの日記

技術的メモをしていきたい日記

-Wpessimizing-moveオプション と -Wredundant-moveオプション

LLVM/Clangでは、戻り値最適化(RVO; return value optimization)を阻害する/単に冗長なstd::move関数利用を警告するオプションが提供される。

Clang 3.7で追加された警告オプション。両オプションとも -Wall オプション指定に含まれるため、個別に指定するケースは少ないはず。

Improvements to Clang's diagnostics

  • (snip)
  • -Wredundant-move warns when a parameter variable is moved on return and the return type is the same as the variable. Returning the variable directly will already make a move, so the call is not needed.
  • -Wpessimizing-move warns when a local variable is moved on return and the return type is the same as the variable. Copy elision cannot take place with a move, but can take place if the variable is returned directly.
  • (snip)
http://llvm.org/releases/3.7.0/tools/clang/docs/ReleaseNotes.html
  • -Wpessimizing-move:copy elision最適化を阻害するstd::move呼び出しを警告する。余計なムーブコンストラクタ呼び出しを避けるため、std::move呼び出しを削除することが望ましい。
  • -Wredundant-move:単に冗長なstd::move呼び出しを警告する。copy elision基準を満たさないため(→id:yohhoy:20120808)、std::moveの明示有無によらずムーブコンストラクタは呼び出される。
struct X {};
X make_X() { return {}; }

X f()
{
  X v1 = std::move(make_X());  // "X v1 = make_X();"が望ましい
  // warning: moving a temporary object prevents copy elision [-Wpessimizing-move]

  return std::move(v1);  // "return v1;"が望ましい
  // warning: moving a local object in a return statement prevents copy elision [-Wpessimizing-move]
}

X h(X a1)
{
  return std::move(a1);  // "return a1;"と同義
  // warning: redundant move in return statement [-Wredundant-move]
}

関連URL