0

的一个重要功能MyClass是快速调用其成员之一的方法;我试图鼓励这个电话的内联。该成员的类型为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

如果您将 Foo 作为指针存储在 MyClass 中,然后将 code() 的定义移动到 test.cpp 中,然后仅从 test.cpp 中调用 code(),则应该内联。无论如何,您似乎没有理由在另一个翻译单元中调用像 code() 这样的私有成员:

测试.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();
};

测试.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 回答