0

の重要な機能はMyClass、メンバーの 1 つのメソッドをすばやく呼び出すことです。この呼び出しのインライン化を奨励しようとしています。メンバーのタイプはFooです。その実装とインターフェースを匿名の名前空間に配置して非表示 にしたいと考えています。Foo

関連するソース ファイルとヘッダー ファイルが現在どのように設定されているかを以下に示します...

test.hには、次のものがあります。

struct Foo;

class MyClass {
public:
    void doStuff();
private:
    Foo f;
    inline unsigned long long int code() { return f.getCode(); }
};

test.cppには、次のものがあります。

namespace
{

struct Foo {
public:
    unsigned long long int getCode() {
        // ...
    }
};

} // end anon namespace

void MyClass::doStuff() {
    // do stuff, such as calling code()
}

もちろん、問題は、 のインライン定義のコンテキストでは、 が完全な型ではないことですMyClass::code()f

Fooインライン化しながら非表示にする方法はありますMyClass::code()か?

4

1 に答える 1

1

MyClass 内に Foo をポインターとして格納し、code() の定義を test.cpp に移動し、test.cpp 内からのみ code() を呼び出す場合は、インライン化する必要があります。いずれにせよ、別の翻訳単位で code() のようなプライベート メンバーを呼び出す理由はないようです。

test.h

class MyClass
{
public:
    void doStuff();
private:
    struct Foo; // nested class, you cant access 
                // it from anon namespace in test.cpp otherwise
    std::unique_ptr<Foo> f;
    inline unsigned long long int code();
};

test.cpp

struct MyClass::Foo
{
public:
    unsigned long long int getCode()
    {
        // ...
    }
};

unsigned long long int MyClass::code()
{
    return f->getCode();
}

void MyClass::doStuff()
{
   code(); // should be inlined
}

コンパイル時に、コンパイラーは、ヒューリスティック分析に基づいて有益であると判断した関数をインライン化し、関数の定義を確認できる場合にインライン化します。この場合、これは問題になりません。

リンク時の最適化では、多くの場合、これをさらに一歩進めて、コンパイル時に定義が表示されなかった関数をインライン化できます。

于 2013-10-01T05:21:48.607 に答える