Предположим, у нас есть такой код:
template<typename T>
struct StrongValue{
constexpr const T &operator()() const {
return value;
}
T &operator()(){
return value;
}
constexpr const T &get() const {
return value;
}
T &get(){
return value;
}
T value;
};
using myint = int; // try double too
using m = StrongValue<myint>;
myint sum2(const m &a, const m &b){
return a() + b();
}
myint sum2a(const m a, const m b){
return a() + b();
}
myint sum1(myint a, myint b){
return a + b;
}
int main(){
constexpr m a{5};
constexpr m b{5};
return sum2a(a, b);
}
как в clang, так и в gcc, -O3 выглядит так:
sum2(StrongValue<int> const&, StrongValue<int> const&):
mov eax, DWORD PTR [rsi]
add eax, DWORD PTR [rdi]
ret
sum2a(StrongValue<int>, StrongValue<int>):
lea eax, [rdi+rsi]
ret
sum1(int, int):
lea eax, [rdi+rsi]
ret
main:
mov eax, 10
ret
Почему sum2
скомпилирован так?
Это потому, что компилятор изменит сигнатуру функции, если пропустит ссылку, поэтому ему это запрещено.
Означает ли это, если не встроено, sum2
дороже, чем sum2a
?