3

valgrind --tool=callgrind ./executable次のコードによって生成された実行可能ファイルで実行します。

#include <cstdlib>
#include <stdio.h>
using namespace std;

class XYZ{
public:
    int Count() const {return count;}
    void Count(int val){count = val;}
private:
    int count;
};

int main() {
    XYZ xyz;
    xyz.Count(10000);
    int sum = 0;
    for(int i = 0; i < xyz.Count(); i++){
//My interest is to see how the compiler optimizes the xyz.Count() call
        sum += i;
    }
    printf("Sum is %d\n", sum);
    return 0;
}

次のオプションを使用してdebugビルドを作成します-fPIC -fno-strict-aliasing -fexceptions -g -std=c++14releaseビルドには次のオプションがあります: -fPIC -fno-strict-aliasing -fexceptions -g -O2 -std=c++14.

valgrind を実行すると、2 つのダンプ ファイルが生成されます。これらのファイル (1 つはデバッグ実行可能ファイル、もう 1 つはリリース実行可能ファイル) を KCachegrind で表示すると、デバッグ ビルドは次のように理解できます。

デバッグ ビルド

予想どおり、関数XYZ::Count() constは 10001 回呼び出されます。ただし、最適化されたリリース ビルドは解読するのがはるかに難しく、関数が何回呼び出されているかは明確ではありません。関数呼び出しがinlined. しかし、それが実際にインライン化されていることをどうやって知るのでしょうか? リリース ビルドのコールグラフは次のとおりです。

リリースビルド

XYZ::Count() constからの機能の表示は全くないようmain()です。

私の質問は次のとおりです。

XYZ::Count() const(1) デバッグ/リリース ビルドによって生成されたアセンブリ言語コードを見ずに、KCachegrind を使用して、特定の関数 (この場合は ) が呼び出された回数をどのように把握できますか? 上記のリリース ビルド コール グラフでは、関数は一度も呼び出されていません。

(2) リリース/最適化ビルド用に KCachegrind によって提供されるコールグラフやその他の詳細を理解する方法はありますか? https://docs.kde.org/trunk5/en/kdesdk/kcachegrind/kcachegrind.pdfで入手可能な KCachegrind マニュアルを既に見ましたが、見るべき便利なハック/経験則があるかどうか疑問に思っていましたリリースビルド用。

4

2 に答える 2