Я не люблю повторяться в коде, но и не хочу терять производительность из-за простых функций. Предположим, что класс имеет operator+
и функцию Add
с одинаковой функциональностью (рассматривая первый как удобный способ использования класса в выражениях, а последний как «явный» способ сделать это)
struct Obj {
Obj operator+(float);
Obj Add(float);
/* some other state and behaviour */
};
Obj AddDetails(Obj const& a, float b) {
return Obj(a.float_val + b, a.some_other_stuff);
}
Obj Obj::operator+(float b) {
return AddDetails(*this, b);
}
Obj Obj::Add(float b) {
return AddDetails(*this, b);
}
Для облегчения изменений обе функции реализованы с вызовом вспомогательной функции. Поэтому на каждый звонок оператору приходится 2 звонка, что не очень приятно.
Но достаточно ли умен компилятор, чтобы исключить такие двойные вызовы?
Я тестировал на простых классах (которые содержат встроенные типы и указатели) и оптимизатор просто не вычисляет что-то ненужное, но как он ведет себя в больших системах (особенно с горячими вызовами)?
Если это то, где происходит RVO, то работает ли он в больших последовательностях вызовов (3-4), чтобы сложить его в 1 вызов?
P.S. Да-да, преждевременная оптимизация - корень всех зол, но все же хочется ответа
inline
повысит шансы на то, что это будет оптимизировано. - person 1201ProgramAlarm   schedule 27.02.2019AddDetails
хотя бы не объявлен со статической областью действия. При экспорте из TU модель стоимости для размера кода уже может блокировать встраивание на основе накладных расходов на расширение параметра. Конструктор, операторы иAddDetails
объявлены в одном TU, аObj
с конструктором перемещения по умолчанию потребуется для почти гарантированного встраивания. - person Ext3h   schedule 27.02.2019assign
/operator=
или операторы сравнения, где (N) RVO не применяется). - person Jarod42   schedule 27.02.2019