0


プロジェクトがデバッグ/リリース状態にあるかどうかに応じて、単純なメソッドを2回定義するのが良い習慣なのか悪い習慣なのか、私はいつも疑問に思っていました 。これはそれらをインライン化するためのものです。たとえば、Foo.h:


class Foo
{
        public:
                ...

                const bool& IsBoolean() const;

        private:
                bool _boolean;
};

#ifndef _DEBUG

/** We're in release, so let's advice compiler to inline this...
  *
  *
  */

inline const bool& Foo::IsBoolean() const
{
        return _boolean;
}

#endif

そして今、Foo.cpp で:


#include "Foo.h"

...

#ifdef _DEBUG

/** We're debugging this, no need for inlining...
  *
  *
  */

const bool& Foo::IsBoolean() const
{
        return _boolean;
}

#endif

これは完全に無駄ですか?たとえば、メソッドをすべて単独でインライン化/最適化するコンパイラ (MSVC) の機能が原因ですか?

それにもかかわらず、これは私が何年も前から使ってきたものです。ここで完全に間違っている場合は、修正してください...

4

4 に答える 4

9

いくつかの理由から、それは時間の無駄です。

inline キーワードは、コンパイラが自由に無視できるヒントです。キーワードを指定しなくても自由にインライン化できるように。したがって、それを追加するかどうかは、おそらくコンパイラにとって何も変わらないでしょう

さらに、クラス定義内で定義された関数は暗黙的にインライン化されます。そのため、getter や setter などの短い関数はほとんどの場合、クラス定義内で定義されます。

次に、関数をインラインとしてマークしたい場合、デバッグ ビルドでも実行しない理由はありません。

このinlineキーワードは、コンパイラが実際に関数をインライン化することとはほとんど関係ありません。それらは別個の概念です。プログラマによってマークinlineされた関数は、リンカが複数の同一の定義を見つけても心配する必要がないことを意味します。これは通常、関数がヘッダーで定義され、複数のコンパイル ユニットに含まれる場合に発生します。関数がインラインでマークされている場合、リンカーは定義を一緒にマージします。そうでない場合は、エラーが発生します。つまり、このキーワードを追加および削除すると、コンパイラ エラーが発生します。それはおそらくあなたが望むものではありません。

C++ キーワードとコンパイラの最適化の間に若干の重複がある唯一の理由はinline、関数が とマークされている場合inline、すべてのコンパイル単位に #include しても安全であるためです。これは、関数が呼び出されたときに定義が常に表示されることを意味します。 . これにより、コンパイラが関数への呼び出しをインライン化することが容易になります。

最後に、インライン化によって常にパフォーマンスが向上するとは限りません。インライン化によってコード サイズが爆発的に増大し、キャッシュ ミスが増加し、全体としてコードの速度が低下する状況を簡単に作成できます。inlineこれが、 (せいぜい) がオプティマイザによってヒントとして扱われる理由の 1 つです。最悪の場合、完全に無視されます。

したがって、あなたがしていることは、1) リリース ビルドには存在しなかったデバッグ モードでのコンパイラ エラーを引き起こし、2) パフォーマンスには影響しません。

于 2009-05-26T20:57:37.423 に答える
2

スペースの無駄と不要なコードの重複のように見えます。通常、コンパイラは、インライン化する関数とインライン化しない関数を独自に決定することができます。(Link Time Code Generation) スイッチを持つ MSVC を使用している場合はなおさらです。これ/LTCGは、cpp にある場合でも、単純なメソッドがインライン化されることを意味します。

于 2009-05-26T20:48:03.463 に答える
1

繰り返しは悪いです。脳死状態のコンパイラを扱っている場合でも、最悪の場合、1 か所でINLINE定義されたマクロを使用するか、まったく使用しないことで、この繰り返しを簡単に回避できます。inline

于 2009-05-26T20:47:53.573 に答える
1

必要なことを行う最も簡単な方法は、コードを独自のファイルfilename.inlに配置し、条件付きでそのファイルをヘッダーまたはソース ファイルに含めることです。また、 .inlファイル内の関数の前に、ファイルがヘッダーにインクルードされている場合はインラインに、それ以外の場合は空のマクロに展開される条件付きマクロを付ける必要があります。

于 2009-05-26T20:53:02.020 に答える