0

C++ コンパイラが空の (静的) 関数を最適化することは知っています。

-Dその知識に基づいて、(コンパイラのオプションを使用して) 識別子が定義されるたびに最適化されるべきコードを書きました。次のダミーの例を検討してください。

#include <iostream>

#ifdef NO_INC

struct T {
    static inline void inc(int& v, int i) {}
};

#else

struct T {
    static inline void inc(int& v, int i) {
        v += i;
    }
};

#endif

int main(int argc, char* argv[]) {
    int a = 42;

    for (int i = 0; i < argc; ++i)
        T::inc(a, i);

    std::cout << a;
}

望ましい動作は次のとおりです:NO_INC識別子が定義されているときはいつでも (-DNO_INCコンパイル時に使用)、すべての呼び出しをT::inc(...)最適化する必要があります (空の関数本体のため)。それ以外の場合、 への呼び出しは、T::inc(...)特定の value によるインクリメントをトリガーする必要がありますi

これに関して2つの質問があります:

  1. 空の関数への呼び出しが最適化されているため、オプションT::inc(...)を指定したときに への呼び出しがパフォーマンスに悪影響を与えないという私の仮定は正しいですか?-DNO_INC
  2. a関数本体は空ですが、変数 (およびi) が呼び出されたときにまだキャッシュにロードされているのではないかと思います (T::inc(a, i) それらがまだ存在しないと仮定します)。

アドバイスをありがとう!

4

3 に答える 3