c++ - 如果没有带有函数签名的右值参数,C++ 11 中的 Move Semantic 会被执行吗?
问题描述
为了让程序更高效地运行,从 C++ 11 开始引入了 move 语义,例如:
void fun(const string& str); //1st
void fun(string&& str); //2nd since c++ 11
如果我像这样使用它fun("tmpStr");
,将使用带有右值签名的第二个函数,它比第一个函数更有效。
但问题是,如果我只需要 1 个函数签名来处理具有左值和右值的参数,我该怎么办?
- 如果保留第一个,则右值无效;
- 如果保留第二个,则使用右值是有效的,但我必须
fun(std::move(lvalue))
使用左值使其成为可能,我认为添加的代码std::move
看起来像多余的---此外,这使得左值的状态在此函数之后未定义。
有了上面的想法,我想知道如果没有像第一个这样的函数签名的右值参数,即使只是在发布(优化)模式下,C++ 11 中的 Move Semantic 是否会被执行?如果答案不是,那么背后的原因是什么?
解决方案
在这种情况下,移动语义无关紧要,因为您不想修改参数。
"tmpStr"
不是一个std::string
,是一个const char*
。由于您正在对 进行非(const lvalue)引用std::string
,因此编译器必须在某个地方创建一个std::string
。分配开销已经产生。然后,如果您不修改临时字符串,那么您使用哪个引用实际上并不重要。编写函数的最佳方法是:
void fun(std::string_view sv)
这会自动处理字符串文字和std::string
s 等,并产生零分配开销。这比搬家更有效率。不涉及移动语义。
推荐阅读
- postgresql - 在 postgresql 中不使用 typeorm 的 typescript 之间的日期时间
- javascript - 在页面加载时显示全屏 gif,并在 gif 完成后关闭它
- linux - 无法找到默认 shell 为 bash 的常规文件,但当它是 ksh 时可以工作
- linux - 在 Bash 脚本中将文件内容作为密码参数传递
- matlab - 制定没有图像的 MatLab 深度神经网络
- python - 会话对象上的 Flask 会话(文件系统)UnPicklingError,是否有大小限制或者我是否有损坏?
- c# - 导航后重新创建页面/列表视图。PushAsync Xamarin.forms
- javascript - 录制时未捕获会议中所有用户的音频
- javascript - Firestore Timestamp.fromDate 不是 UTC
- django - 是否可以覆盖 Django 针对 UniqueConstraint 错误显示的错误消息?(完整性错误)