【发布时间】:2012-06-01 23:15:22
【问题描述】:
在我的实现文件(.cc 文件)中,我经常发现在类定义中定义成员函数(例如 Pimpl 类的函数)很方便。例如:
struct X::Impl {
void DoSomething() {
...
}
};
而不是
struct X::Impl {
void DoSomething();
};
void X::Impl::DoSomething() {
...
}
我认为这比在类定义之外实现函数更可取,原因有几个。它增强了可读性并促进了保持方法小(通过使其易于添加)的实践。代码也更易于维护,因为您无需更新方法声明。
我看到的唯一缺点是类声明中定义的方法是隐式内联的,由于目标代码的大小增加,这通常是不可取的。
我的问题是:
我有这个权利吗?我还缺少这种做法的其他缺点吗?
隐式内联是否值得担心?编译器是否足够聪明,可以拒绝我对不应内联的内联方法的隐式请求?
是否可以(通过编译器扩展或其他方式)声明类定义中定义的方法不被内联?
【问题讨论】:
-
它的可读性并不高,函数应该很小的想法来自教授,而不是现实世界。这是一个虚假的规则。
-
GCC 有
-fno-inline但我认为关闭它会很愚蠢,我相信 gcc 会做出比我更明智的决定。 -
@JohnDibling:同意。重要的是要注意函数的 C++ 代码应该小以提高可读性,但生成的代码不必如此。让编译器做它最擅长的事情。
-
另外,如果你把 pimpl 定义放在标题中,它就不是真的 pimpl 了吗?
-
也许我们可以为 C++27 提出一个新的 'outline' 关键字
标签: c++