别名方法和性能问题

Alias Methods and Performance Concerns

本文关键字:问题 性能 方法 别名      更新时间:2023-10-16

为了提高代码的可读性,有时我使用"别名方法"。这些基本上都是做同样事情的方法(至少在基类中;派生类可以使用不同的名称,根据上下文增强类用户的代码可读性。考虑下面的示例代码:

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作为我的编译器

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

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

但是,如果函数是虚函数,则不适用。

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