Рассмотрим следующий код:
#include <string>
#include <sstream>
int main()
{
const std::string name = "test test test";
const std::string st = name.substr(0, 7);
const std::string& st2 = name.substr(0, 7);
}
Я знаю о теоретической разнице, но при взгляде на код сборки вообще не видно разницы при -O2. См. Ниже:
st:
mov ecx, 7
xor edx, edx
lea rdi, [rsp+32]
mov rsi, rsp
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::substr(unsigned long, unsigned long) const
st2:
mov ecx, 7
xor edx, edx
lea rdi, [rsp+64]
mov rsi, rsp
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::substr(unsigned long, unsigned long) const