【发布时间】:2020-05-20 18:58:15
【问题描述】:
假设我有这门课
class Point
{
inline float x() const { return v[0]; }
inline float y() const { return v[1]; }
inline float z() const { return v[2]; }
float v[3];
};
我愿意:
Point myPoint;
myPoint[0] = 5;
// unrelated code goes here
float myVal = myPoint.x() + 5;
-O2 或 -O3 上的 GCC 是否会优化对 x() 的任何调用而只获得 v[0]?即:
float myVal = myPoint.v[0] + 5;
或者这是不可能的原因?
更新:应该提一下,我确实意识到 inline 更多的是对编译器的建议,但无论如何我都想知道。
另外一个问题是,模板化这个类会对可以进行的优化产生任何影响吗?
【问题讨论】:
-
扩展@Slava 的评论:在类体内完全定义的函数自动成为
inline函数(或者如果两者之间有任何区别,我不知道) -
@TylerShellberg
inline不一定会导致函数被内联。这只是一个提示;如果函数很大,一个合理的编译器无论如何都不会内联它。 -
@TylerShellberg 在
class定义中定义的方法被隐式标记为inline,这是从 C++98 开始的。如果你愿意,你可以让它明确,但这不会做任何改变。它类似于将virtual用于子类,您可以明确说明但不会改变任何内容 -
@HolyBlackCat 严格来说它只是优化器的一个热门,但从语言的角度来看差异很大 - 它允许函数/方法的多个定义。
-
完整的定义必须在类中才能成为
inline。声明是不行的。如上所述,编译器可能有其他计划。请参阅As If Rule:如果您无法区分,编译器可以对代码执行任何操作。
标签: c++ c++11 gcc optimization accessor