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()
?
答案 0 :(得分:1)
如果将Foo作为指针存储在MyClass中,然后将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
}
在编译时,编译器将根据启发式分析内联任何它认为有益的函数,并且它是否可以看到函数的定义。在这种情况下哪个应该不是问题。
链接时优化通常可以更进一步,并且在编译期间定义不可见的内联函数。