别名方法和性能问题

时间:2011-10-02 18:14:26

标签: c++ performance visual-studio-2010

为了提高代码可读性,有时我使用“别名方法”。这些基本上都是使用不同名称执行相同操作的方法(至少在基类中;派生类可能以不同方式执行),这些方法根据上下文增强了类用户的代码可读性。请考虑以下代码示例:

template <typename T>
class Foo {
public:

    T bar() { /* Lots of stuff here */ }

    inline T bar_alias1() { return this->bar(); }
    inline T bar_alias2() { return this->bar(); }
};

当然,如果Foo::bar()是一个小函数,那么只需复制所有别名方法中的代码。但是,由于代码可能相对较大,因此应避免代码重复,因此将别名方法声明为内联。但我知道编译器不保证任何声明为inline的函数实际上最终会在编译时被扩展。

所以我的问题是,我是否通过创建这些别名方法来引入任何性能开销?在下面的代码中:

Foo<BIG_OBJECT> foo;
BIG_OBJECT bo1 = foo.bar();
BIG_OBJECT bo2 = foo.bar_alias1();

假设传递的对象比较大,调用foo.bar()会比调用foo.bar_alias1()更快吗? Foo::bar_alias1()调用Foo::bar()时是否有对象的冗余副本?

我正在使用Visual Studio 2010作为我的编译器。

1 个答案:

答案 0 :(得分:4)

假设别名函数是内联的 - 并且它们应该给出大小。 不应该有任何性能开销。如果编译器决定省略函数代码并内联所有调用,代码大小也不会增加。

(我指的是bar_alias1()的内联,bar()本身不一定会被内联,如果它很大。)

但是,如果功能是虚拟的,则不适用。

在C中,我会更直接地使用预处理器,但我不确定它在C ++中是否合适。