Чтобы улучшить читабельность кода, иногда я использую «методы псевдонимов». В основном это методы, которые делают одно и то же (по крайней мере, в базовом классе; производные классы могут делать это по-разному) с разными именами, которые улучшают читаемость кода для пользователя класса в зависимости от контекста. Рассмотрим код ниже для примера:
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 в качестве компилятора.