Методы псевдонимов и проблемы производительности - PullRequest
3 голосов
/ 02 октября 2011

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

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 Ответ

4 голосов
/ 02 октября 2011

Предполагается, что псевдонимы-функции встроены - и они должны иметь размер.Там не должно быть никаких накладных расходов.Размер кода также не увеличится, если компилятор решит опустить код функции и встроить все вызовы к нему.

(я имею в виду вставку bar_alias1(), bar() сама выиграла 'не обязательно быть встроенным, если оно большое.)

Однако это не относится к виртуальным функциям.

В C я бы сделал это более напрямую с препроцессором, но яне уверен, насколько это уместно в C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...