ReSharper C++を使用する

はじめに

こんにちは、開発部エンジニアの武田です。

普段はゲーム開発エンジニアとしてキャラクター制御からゲームロジックの制御、そしてUnityとゲーム開発に関わることはなんでもやっています。

今回、検証でReShaperC++を触ったのでまとめておこうと思います。

ReSharperC++とは

JetBrains社が提供するVisual Studioのアドオンです。

オンザフライによる静的解析、リファクタリング、コード支援などをしてくれます。

有料にはなりますが、VisualStudioでは届かない細かな部分をフォローしてくれるので実装に注力できる素晴らしいツールです。

少し使用した中で私が感動した機能のいくつかを紹介していきたいと思います。

インクルードの分析

C++で書かれたプロジェクトが大規模になってくると課題になるのはビルド時間です。その原因の一つとなるのがインクルードファイル数やその深さになります。そんな時にインクルード解析機能を使用するとどのファイルがどの程度インクルードされたのかを視覚的に把握できるようになります。

main.cppがincludeしているファイルはvector,iostream,algorithm,memory,stdio.hで、main.cppとそれに含まれるすべてのヘッダーを合わせたコード行は62,595行で、vectorヘッダはそのうちの25,031行である事が一目でわかります。

この情報を元に不要なincludeの削除、前方参照の確認、PImpl実装への置き換えを検討する事が出来ます。

コード解析

適当に書いたコードでも解析して課題があれば修正提案をしてくれます。実例を見ながら説明していきたいと思います。
構造体HpParamをvectorコンテナに追加して、それをprintするサンプルソースです

#include <stdio.h>
#include <vector>
#include <test>
#include <memory>
#include <algorithm>

struct HpParam
{
	HpParam(int hp, int maxHp)
		:mHp(hp)
		,mMaxHp(maxHp)
	{
	}

	int mHp;
	int mMaxHp;
};

int main()
{
	std::vector valueList;
	valueList.push_back(HpParam(10, 10));
	valueList.push_back(HpParam(20, 20));
	valueList.push_back(HpParam(30, 30));

	for (auto value : valueList)
	{
		printf("%d", value.mHp);
		printf("%d", value.mMaxHp);
	}
}

下の画像はVisualStduio2022でReshaperC++がインストールされている画面を切り出したものです。これで見ると改善部分に緑の波線が入ります

波線の部分をマウスオーバーすると理由が表示されますので、それぞれ見ていきましょう

  • modernize-deprecated-headers
    • Cライブラリの一部ヘッダはC++で非推奨となり、C++では歓迎されていなことを教えてくれています

  • modernize-use-emplace
    • push_backよりも同等機能を持つemplaceメソッドの方が冗長性が減り、より効率的なコードが生成される可能性

  • valueはコピーが発生している。const修飾子に変更できます

提案を受けて修正

指摘された箇所を機械的に直したのが下の画像になります。しかし新たに、emplace_back(HpParam(...に緑の波線が付いています。

これをマウスオーバーするとUnneccessary template object created while calling emplace_back(下の画像)と表示されます

不要な一次コピーが発生しているとの指摘です。この書き方だとHpParam定義で一変数を作成してからemplace_backでコピーしてしまっていますね。これをemplace_backした先でオブジェクトが作られるように修正します

これで緑の波線がなくなり良いコードになりました!

まとめ

日々コードを書いてると、メソッドの戻り値を参照で受けるつもりが&constをつけ忘れてしまう事があります。そんな時にReShaperC++を使用してれば「緑の波線」が教えてくれてちょっとしたコードミスを即座に修正ができるので大変便利だと感じました。

あとC++に精通していない人でもこれを使う事で言語特有の問題を意識しないで書けるのではないでしょうか。

ちなみに自分が担当してるプロジェクトで確認したら私の書いたソースコードは波線ばかりになってしまいとても焦りました。。

ReShaperC++