为了提高代码可读性,有时我使用“别名方法”。这些基本上都是使用不同名称执行相同操作的方法(至少在基类中;派生类可能以不同方式执行),这些方法根据上下文增强了类用户的代码可读性。请考虑以下代码示例:
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作为我的编译器。
答案 0 :(得分:4)
假设别名函数是内联的 - 并且它们应该给出大小。 不应该有任何性能开销。如果编译器决定省略函数代码并内联所有调用,代码大小也不会增加。
(我指的是bar_alias1()
的内联,bar()
本身不一定会被内联,如果它很大。)
但是,如果功能是虚拟的,则不适用。
在C中,我会更直接地使用预处理器,但我不确定它在C ++中是否合适。