Mar*_*aux 70 c++ performance inline getter-setter
public:
inline int GetValue() const {
return m_nValue;
}
inline void SetValue(int nNewValue) {
this -> m_nValue = nNewValue;
}
Run Code Online (Sandbox Code Playgroud)
在Learn C++上,他们表示会跑得更快.所以,我认为在getter和setter上使用它会很棒.但也许,它有一些缺点吗?
Jar*_*Par 58
在探查器明确告诉我不内联导致性能问题之前,我没有内联任何内容.
C++编译器非常智能,几乎可以自动为您自动内联这样的简单函数.通常它比你更聪明,并且会更好地确定应该或不应该内联的内容.
我会避免考虑是否内联并专注于解决方案.inline
稍后添加关键字(这不是内联BTW的保证)非常容易,并且可以使用分析器轻松找到潜在的位置.
Ara*_*raK 29
如果在定义中写入它们,则inline
默认情况下会考虑它们.
这意味着它们将被允许在多个编译单元中(因为类定义本身通常出现在多个编译单元中),而不是它们实际上将被内联.
Gre*_*jan 16
这是公共API中的不良做法.对这些函数的任何更改都需要重新编译所有客户端.
一般来说,getter和setter显示的是抽象不佳,不要这样做.如果您经常访问另一个类中的原始数据,那么您可能需要重新安排您的类,而不是考虑您希望如何操作类中的数据并提供适当的方法来执行此操作.
我还想补充一点,除非你每帧执行数百万次获取/设置,否则这些是否内联几乎无关紧要.老实说,不值得失眠.
另外,请记住,仅仅因为您在声明+定义前面加上"inline"一词,并不意味着编译器会内联您的代码.它使用各种启发式方法来确定它是否有意义,这通常是速度与大小的经典折衷.然而,有一个暴力的'__forceinline'关键字,至少在VC++中(我不确定它在GCC中是什么),它扼杀编译器花哨的启发式.我真的不推荐它,除了一旦你移植到不同的架构,它可能是不正确的.
尝试将所有函数定义放在实现文件中,并保留标题的纯声明(除非你是模板元编程(STL/BOOST/etc),在这种情况下,几乎所有内容都在标题中;))
人们喜欢内联的经典场所之一(至少在视频游戏中,这是我来自哪里),是数学标题.交叉/点积,矢量长度,矩阵清除等通常放在标题中,我认为这是不必要的.9/10它对性能没有影响,如果你需要做一个紧密的循环,比如用一些矩阵变换一个大的矢量数组,你可能最好手动进行数学内联,甚至更好地编码特定于平台的汇编程序.
哦,还有另外一点,如果你觉得你真的需要一个类比代码更多的数据,考虑使用好的旧结构,它不会带来抽象的OO包袱,这就是它的用途.:)
对不起,这并不意味着继续这么多,但我认为考虑现实世界的用例是有帮助的,而不是太愚蠢的编译器设置(相信我,我去过那里;))
祝好运.
巴蒂尔
归档时间: |
|
查看次数: |
31843 次 |
最近记录: |