吸气剂的成本是否为零?

时间:2011-10-24 09:43:19

标签: c++ performance

我有一个简单的课程:

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;
}

5 个答案:

答案 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,因此不会有任何性能损失。