public:
inline int GetValue() const {
return m_nValue;
}
inline void SetValue(int nNewValue) {
this -> m_nValue = nNewValue;
}
在 Learn C ++ 上,他们表示会跑得更快。所以,我认为在getter和setter上使用它会很棒。但也许,它有一些缺点吗?
答案 0 :(得分:55)
我没有内联任何内容,直到分析器明确告诉我内联不会导致性能问题。
C ++编译器非常智能,几乎可以自动为您自动内联这样的简单函数。通常它比你更聪明,并且会更好地确定应该或不应该内联的内容。
我会避免考虑是否要内联并专注于解决方案。稍后添加inline
关键字(这不是内联BTW的保证)非常容易,并且可以使用分析器轻松找到潜在的位置。
答案 1 :(得分:29)
如果您在定义中写下这些内容,默认情况下会将其视为inline
。
这意味着它们将被允许在多个编译单元中(因为类定义本身通常出现在多个编译单元中),不它们实际上 内联。< / p>
答案 2 :(得分:16)
这是公共API的不良做法。对这些功能的任何更改都需要重新编译所有客户端。
一般来说让getter和setter显示出糟糕的抽象,不要这样做。 如果你经常转到另一个类中的原始数据,那么你可能需要重新安排你的类,而不是考虑你希望如何操作类中的数据并提供适当的方法。
答案 3 :(得分:10)
否定点:
编译器可以随意忽略您。
对这些功能的任何更改都需要重新编译所有客户端。
一个好的编译器会在适当的时候内联非内联函数。
答案 4 :(得分:5)
我还想补充一点,除非你每帧执行数百万次获取/设置,否则这些内联是否内联几乎无关紧要。老实说,不值得失眠。
另外,请记住,仅仅因为你在声明+定义前加上'inline'这个词,并不意味着编译器会内联你的代码。它使用各种启发式方法来确定它是否有意义,这通常是速度与大小的经典折衷。然而,有一个暴力的'__forceinline'关键字,至少在VC ++中(我不确定它在GCC中是什么),它扼杀了编译器的花哨启发式。我真的不推荐它,除了一旦你移植到不同的架构,它可能是不正确的。
尝试将所有函数定义放在实现文件中,并保留标题的纯声明(除非你是模板元编程(STL / BOOST / etc),在这种情况下,几乎所有东西都在标题中;))
人们喜欢内联的一个经典场所(至少在视频游戏中,我来自哪里),是数学标题。交叉/点积,矢量长度,矩阵清除等通常放在标题中,我认为这是不必要的。 9/10它对性能没有影响,如果你需要做一个紧密的循环,比如用一些矩阵变换一个大的矢量数组,你可能最好手动进行数学内联,甚至更好地编码特定于平台的汇编程序。
哦,另外一点,如果你觉得你真的需要一个类比代码更多的数据,考虑使用好的旧结构,它不会带来抽象的OO包袱,这就是它的用途。 :)
对不起,这并不意味着继续这么多,但我认为考虑现实世界的用例是有帮助的,而不是太愚蠢的编译器设置(相信我,我去过那里;))
祝你好运。沙恩
答案 5 :(得分:2)
代码编译时间会稍长,而且会丢失封装。一切都取决于项目的规模和性质。在大多数情况下,如果它们没有任何复杂的逻辑,就可以使它们内联。
顺便说一句,如果直接在类定义中实现,则可以跳过inline
。
答案 6 :(得分:2)
通过将代码放在标题中,您将公开内部类工作。客户可能会看到这一点并对您的班级如何运作做出假设。这可能会使您在不破坏客户端代码的情况下更改您的课程变得更加困难。
答案 7 :(得分:1)
我会说你不需要为此烦恼。阅读FAQ section about inlining。
答案 8 :(得分:1)
没有必要,开始信任编译器,至少对于这样的优化! “但并不总是”
答案 9 :(得分:1)
inline关键字在您的情况下毫无意义
无论关键字如何,编译器都会内联您的函数。
关键字内联会影响链接而不是内联。这有点令人困惑,但请仔细阅读。
如果定义与调用位于不同的编译单元(基本上是预处理器之后的源文件),则只有在启用整个项目优化和链接时间代码生成时才能进行内联。启用它会大大增加链接时间(因为它实际上重新编译了链接器中的所有内容),但显然可以提高性能。不确定GCC和VS中是否默认开启或关闭。
答案 10 :(得分:0)
我得说,我对此线程中的其他人似乎没有强烈厌恶这种做法。我同意,除了使用最多的情况外,内联的性能提升可以忽略不计。 (是的,我已经在实践中遇到过这样的情况。)在我做这种内联的时候,我这样做是为了方便,而且通常只针对这样的单行。在我的大多数用例中,如果我改变它们,就需要避免在客户端进行重新编译,这种情况并不强烈。
是的,您可以放弃inline
,因为实施的位置暗示了这一点。
另外,我对对访问者的激烈感到有些惊讶。你可以用任何OO语言在课堂上打喷嚏而不用吹嘘几下,而且它们毕竟是从界面抽象实现的有效技术,因此将它们称为糟糕的OO练习有点自虐。
那就是纯粹主义者。 : - )