getter的成本是否为零
Does a getter have zero cost?
我有一个简单的类:
class A {
public:
int get() const;
private:
void do_something();
int value;
}
int A::get() const {
return value;
}
getter函数简单直接。getter要使用它们,所以在do_something中,我应该使用get()
来访问value
。我的问题是:编译器是否会优化getter,使其等同于直接访问数据?或者如果我直接访问它,我仍然可以获得性能(这意味着更糟糕的设计)?
A::do_something()
{
x = get();
// or...
x = value;
}
当方法不是虚方法时,编译器可以对其进行优化。好的编译器(链接时间优化)可以优化,即使方法不是inline
,并在单独的。cpp文件中定义。不太好的只能这样做,如果它是在类定义内声明,或在头文件与inline
关键字。对于虚拟方法,这取决于,但很可能没有。
编译器几乎肯定会内联这样一个微不足道的getter,如果它可以访问定义的话。
如果getter被定义为内联函数(要么通过在类中隐式地定义它,要么通过inline
关键字显式地定义它),编译器通常会将其内联,并且调用它时不会有开销。
然而,在调试构建中禁用内联是很常见的,这是完全有效的,因为编译器不需要内联任何东西。
使用get通常是更好的设计,因为它隐藏了获取值所涉及的实际逻辑(今天它是一个字段,明天它可能需要更复杂的逻辑)。至于性能,虽然访问值本身总是至少和使用get一样快,但编译器很可能会内联调用。
首先,如果您不返回引用而不是值
,则无法在对象中操作值:int& get();
现在它返回一个引用,并且可以被修改。但我认为这不是很清楚,您还应该定义一个setter并使用它回写修改后的值:
int get() const;
void set(int);
...
A::do_something()
{
x = get();
set(value);
}
setter的性能取决于你的编译器。大多数现代编译器都能够内联简单的getter/setter,所以不应该有任何性能损失。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 公共变量是否比使用 getter 和 setter 更快?
- 是否更正C++列表类重载"()"getter和setter的签名
- 此getter是否返回由构造函数或对班内对象的引用给出的引用?C
- C++标准库是否有用于 printf 转换说明符的模板化 getter
- 检测字段或成员 getter 是否为主键的技术
- 在没有公共getter的情况下,比较两个相同类型的对象是否相等
- 编译器是否优化了这部分代码(const getter)
- getter的成本是否为零