【发布时间】:2020-05-15 03:45:15
【问题描述】:
考虑以下代码:
#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
【问题讨论】:
-
为什么你认为它会有所不同?引用的对象仍然必须调用该函数,并且由于它是
const &,因此它延长了临时对象的寿命。 -
理论上有区别吗?
-
您还期待什么?
-
常量引用可以延长临时对象的寿命,就像按值返回的函数的结果一样。它的工作方式没有很好地定义,但大多数实现都会将该引用转换为场景背后的对象,并且对开发人员是不可见的。而且我认为这里的用户可能忘记了这种行为并不直观,第一次遇到时应该会感到惊讶。
-
“我知道理论上的差异”:我建议您添加一个解释,说明您认为理论上的差异是什么。考虑到这个程序在抽象机器上的行为,asm 对两行都做同样的事情并不奇怪。我认为您可能对理论差异有什么误解,或者您没有很好地传达您发现的令人惊讶的内容。
标签: c++ string assembly substring