public:
inline int GetValue() const {
return m_nValue;
}
inline void SetValue(int nNewValue) {
this -> m_nValue = nNewValue;
}
他们说,在Learn C ++上,它将运行得更快。因此,我认为在getter和setter上使用它会很棒。但是,也许有一些缺点吗?
public:
inline int GetValue() const {
return m_nValue;
}
inline void SetValue(int nNewValue) {
this -> m_nValue = nNewValue;
}
他们说,在Learn C ++上,它将运行得更快。因此,我认为在getter和setter上使用它会很棒。但是,也许有一些缺点吗?
Answers:
在探查器明确告诉我没有内联会导致性能问题之前,我不会进行任何内联。
C ++编译器非常聪明,几乎可以肯定会自动为您内联这样的简单函数。通常,它比您更聪明,并且在确定应内联或不应内联的内容方面会做得更好。
我会避免考虑要插入或不插入什么并专注于解决方案。inline
稍后添加关键字(这不是内联BTW的保证)非常容易做到,并且可以使用探查器轻松找到潜在位置。
如果将它们写在定义中,则inline
默认情况下会考虑它们。
这意味着将允许它们在多个编译单元中使用(因为类定义本身通常会出现在多个编译单元中),而不是实际上将它们内联。
inline
如果在类定义中定义了函数,则C ++标准会考虑这些函数,这几乎与内联函数的编译器/链接器完全无关。
这是公共API中的错误做法。对这些功能的任何更改都需要重新编译所有客户端。
通常,具有吸气剂和吸气剂显示出较差的抽象,请不要这样做。如果您要不断访问另一个类中的原始数据,那么您可能需要重新安排您的类,而不是考虑您希望如何在一个类中操纵数据并提供适当的方法。
我还想补充一点,除非您每帧要执行数百万次获取/设置,否则是否内联这些都几乎无关紧要。老实说,这不值得失去睡眠。
另外,请记住,仅因为在声明+定义前面加上了“内联”一词,并不意味着编译器将内联您的代码。它使用各种启发式方法来确定是否有意义,这通常是速度与大小之间的经典折衷。但是,在VC ++中至少有一个蛮力的'__forceinline'关键字(我不确定在GCC中是什么),这使编译器很想不到。我真的不建议这样做,除了一旦您移植到其他体系结构上,它可能是不正确的。
尝试将所有函数定义放在实现文件中,并保留标头的纯声明(当然,除非您要进行模板元编程(STL / BOOST / etc),在这种情况下,标头中几乎所有内容都包含在内;)
人们喜欢内联的经典地方之一(至少在我来自的视频游戏中)是数学标头。十字/点积,向量长度,矩阵清除等通常放在标题中,我认为这是不必要的。9/10对性能没有影响,如果您需要进行紧密循环,例如通过某种矩阵转换大型矢量数组,则最好手动进行内联数学运算,甚至更好地对其进行编码特定于平台的汇编器。
哦,还有一点,如果您觉得确实需要一个类才能使数据多于代码,请考虑使用良好的旧结构,该结构不会带来OO抽象的负担,这就是它的用途。:)
抱歉,并不是说要继续做那么多,但我只是认为考虑现实世界的用例会有所帮助,而不必太过依赖固定的编译器设置(相信我,我去过那里;)
祝好运。
尚恩
我得说,我对此线程上的其他人似乎并不强烈反对这种做法。我同意,除了使用最频繁的案例外,内联带来的性能提升可以忽略不计。(是的,我已经在实践中遇到这样的情况。)如果我做这样的内联的,我这样做是为了方便,一般只为单行这样。在我的大多数用例中,如果我更改了它们,那么避免在客户端进行重新编译的需求并不是那么强烈。
是的,您可以删除 inline
,因为实现的位置暗示它。
另外,我对这种针对访问者的热情感到有些惊讶。您几乎不能轻描淡写使用任何OO语言进行的类学习,毕竟它们是一种从接口抽象实现的有效技术,因此,将它们称为OO实践不佳有点受虐狂。这是很好的建议不写存取乱射,但我也劝你不要在热情冲昏头脑,以消除它们。
纯粹主义者,接受这一点。:-)