首页 > 解决方案 > 如果没有带有函数签名的右值参数,C++ 11 中的 Move Semantic 会被执行吗?

问题描述

为了让程序更高效地运行,从 C++ 11 开始引入了 move 语义,例如:

void fun(const string& str); //1st
void fun(string&& str); //2nd since c++ 11

如果我像这样使用它fun("tmpStr");,将使用带有右值签名的第二个函数,它比第一个函数更有效。

但问题是,如果我只需要 1 个函数签名来处理具有左值和右值的参数,我该怎么办?

  1. 如果保留第一个,则右值无效;
  2. 如果保留第二个,则使用右值是有效的,但我必须fun(std::move(lvalue))使用左值使其成为可能,我认为添加的代码std::move看起来像多余的---此外,这使得左值的状态在此函数之后未定义。

有了上面的想法,我想知道如果没有像第一个这样的函数签名的右值参数,即使只是在发布(优化)模式下,C++ 11 中的 Move Semantic 是否会被执行?如果答案不是,那么背后的原因是什么?

标签: c++c++11movemove-semantics

解决方案


在这种情况下,移动语义无关紧要,因为您不想修改参数。

"tmpStr"不是一个std::string,是一个const char*。由于您正在对 进行非(const lvalue)引用std::string,因此编译器必须在某个地方创建一个std::string。分配开销已经产生。然后,如果您不修改临时字符串,那么您使用哪个引用实际上并不重要。编写函数的最佳方法是:

void fun(std::string_view sv)

这会自动处理字符串文字和std::strings 等,并产生零分配开销。这比搬家更有效率。不涉及移动语义。


推荐阅读