Общий
Да См. Инструкции, генерируемые на https://godbolt.org/z/VB23-W Строка 21
movsd xmm0, qword ptr [rsp] # xmm0 = mem[0],zero
addsd xmm0, qword ptr [rip + .LCPI3_0]
, он просто применяет код AddDetails
прямо вместо того, чтобы даже звонить вашему оператору +.Это называется встраиванием и работает даже для этой цепочки вызовов, возвращающих значения.
Подробности
Не только оптимизация RVO может происходить с однострочными функциями, но любая другая оптимизация, включая встраивание, см. https://godbolt.org/z/miX3u1 и https://godbolt.org/z/tNaSW.
Посмотрите на это, вы можете увидеть, что gcc и clang сильно оптимизируют даже объявленный код без встроенных символов, (https://godbolt.org/z/8Wf3oR)
#include <iostream>
struct Obj {
Obj(double val) : float_val(val) {}
Obj operator+(float b) {
return AddDetails(*this, b);
}
Obj Add(float b) {
return AddDetails(*this, b);
}
double val() const {
return float_val;
}
private:
double float_val{0};
static inline Obj AddDetails(Obj const& a, float b);
};
Obj Obj::AddDetails(Obj const& a, float b) {
return Obj(a.float_val + b);
}
int main() {
Obj foo{32};
Obj bar{foo + 1337};
std::cout << bar.val() << "\n";
}
Даже без встраивания никаких дополнительных вызовов C-Tor невозможно увидеть с помощью
#include <iostream>
struct Obj {
Obj(double val) : float_val(val) {}
Obj operator+(float);
Obj Add(float);
double val() const {
return float_val;
}
private:
double float_val{0};
static Obj AddDetails(Obj const& a, float b);
};
Obj Obj::AddDetails(Obj const& a, float b) {
return Obj(a.float_val + b);
}
Obj Obj::operator+(float b) {
return AddDetails(*this, b);
}
Obj Obj::Add(float b) {
return AddDetails(*this, b);
}
int main() {
Obj foo{32};
Obj bar{foo + 1337};
std::cout << bar.val() << "\n";
}
Однако некоторая оптимизация выполняется из-за того, что компилятор знает, что значение не изменится, поэтому давайте изменим основной на
int main() {
double d{};
std::cin >> d;
Obj foo{d};
Obj bar{foo + 1337};
std::cout << bar.val() << "\n";
}
Но тогда вы все равно можете увидеть оптимизацию на обоих компиляторах https://godbolt.org/z/M2jaSH и https://godbolt.org/z/OyQfJI