C++ 编译器发出std::move()运行时调用?
假设以下代码:C++ 编译器发出std::move()运行时调用?,c++,C++,假设以下代码: // main.cpp #include <iostream> #include <string> #include <utility> using std::cout; using std::string; void print(string && s) { cout << s << '\n'; } int main() { string sso{"With SSO"};
// main.cpp
#include <iostream>
#include <string>
#include <utility>
using std::cout;
using std::string;
void print(string && s)
{
cout << s << '\n';
}
int main()
{
string sso{"With SSO"};
string no_sso{"This string is much too large to have SSO, much too large"};
print(std::move(sso));
print(std::move(no_sso));
}
c++filt
告诉我们第一个损坏的符号是(为简洁起见进行了编辑)
std::remove_reference::type&&std::move(std:_cxx11::basic_string&)
据我所知,std::move()在运行时没有生成任何内容,我将其解释为“std::move()是一个编译时操作”。查看上面生成的程序集,似乎我搞错了
std::move()应该在运行时执行任何操作吗?或者,由于使用-O2编译可以消除此调用,这是否只是编译时未进行优化的结果
据我所知,std::move()在运行时没有生成任何内容,我将其解释为“std::move()是一个编译时操作”。查看上面生成的程序集,似乎我搞错了
不,您做对了,但它仍然是一个函数调用,在关闭优化的情况下,编译器故意不删除其他“无意义”的调用。这有助于调试
这也是为什么“优化关闭”对这种编译模式的描述不好的原因;这更像是“让目标代码比实际需要的更像原始源代码”。“打开优化”的真正含义是“做好将程序的抽象描述转化为可以以有用且高效的方式执行的真实内容的适当工作”。当然,在15世纪,C程序是一种逐步描述你希望执行计算机做什么的程序,在这种情况下,在这个过程的顶部进行“优化”是有意义的……但这种情况已经很久没有出现了
std::move()应该在运行时执行任何操作吗
不,它的效果纯粹是“编译时”,即它的计算结果与您给出的表达式相同,但具有不同的值类别(纯粹的“编译时”概念)。它实际上什么都不“做”
或者,由于使用-O2编译可以消除此调用,这是否只是编译时未进行优化的结果
是。“[I]这只是编译而没有优化的结果吗?”是的。您编译是为了调试。。。这将允许您在debugger@Justin:评论部分不提供问题的答案。你知道的。
print(std::move(sso));
c5f: 48 8d 45 a0 lea -0x60(%rbp),%rax
c63: 48 89 c7 mov %rax,%rdi
c66: e8 05 01 00 00 callq d70
_ZSt4moveIRNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEEONSt16remove_referenceIT_E4typeEOS8_
c6b: 48 89 c7 mov %rax,%rdi
c6e: e8 47 ff ff ff callq bba
_Z5printONSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
std::remove_reference<...>::type&& std::move<...>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)