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