我有一个简单的课程:
class A {
public:
int get() const;
private:
void do_something();
int value;
}
int A::get() const {
return value;
}
getter函数简单明了。 Getters将使用它们,因此在do_something中我应该使用get()
来访问value
。我的问题是:编译器是否会优化出getter,因此它将等同于直接访问数据?或者,如果我直接访问它,我仍然会获得性能(这意味着更糟糕的设计)?
A::do_something()
{
x = get();
// or...
x = value;
}
答案 0 :(得分:7)
当方法不是虚拟的时,编译器可以对其进行优化。即使方法不是inline
并且在单独的.cpp文件中定义,优秀的编译器(具有链接时优化)也可以进行优化。如果它在类定义中声明,或者在带有inline
关键字的头文件中声明,那么不太好的只能这样做。对于虚拟方法,它取决于,但很可能不是。
答案 1 :(得分:3)
如果编译器可以访问定义,编译器几乎肯定会内联这样一个简单的getter。
答案 2 :(得分:2)
如果将getter定义为内联函数(通过在类中定义它,或者使用inline
关键字显式地隐式),编译器通常会内联它,并且调用它时不会有任何开销
然而,调试版本通常禁用内联,这完全有效,因为编译器不需要内联任何内容。
答案 3 :(得分:1)
好吧,使用get通常是一个更好的设计,因为它隐藏了获取值所涉及的实际逻辑(今天它是一个字段,明天它可能需要更复杂的逻辑)。至于性能,虽然访问值本身至少与使用get一样快,但编译器最有可能内联调用。
答案 4 :(得分:1)
首先,如果您没有返回引用而不是值,则无法操作对象中的值:
int& get();
现在它返回一个引用并可以更改。但是imho这个不太干净,你还应该定义一个setter并用它来写回改变的值:
int get() const;
void set(int);
...
A::do_something()
{
x = get();
set(value);
}
setter的性能取决于你的编译器。大多数现代编译器都能够内联简单的getter / setter,因此不会有任何性能损失。