我可以在函数的结果上使用std::move来构造一个新对象吗
Can I use std::move on the result of function to construct a new object?
有人能确认从该函数中产生的字符串是否真的会被移动到成员var中吗?
class Foo {
private:
const std::string m_complex_str;
std::string create_complex_str() {
return std::string("some huge string");
}
public:
Foo() : m_complex_str(std::move(create_complex_str())) { }
};
这样做对吗?
也许大多数编译器都会在没有move函数的情况下为我这样做?
是的,它会被正确移动,因为std::string
构造函数支持std::move
,所以create_complex_str()
的返回值是一个可以安全地为move
'd的纯右值。事实上,即使您自己不这样做,std::move
也会自动被调用(放一个断点,然后查看)——除非可以执行进一步的优化。但是,如果您自己调用std::move
,您可能会阻止编译器通过复制省略/RVO等进行进一步优化。
编译器将在适用的情况下为您消除不必要的副本。只需编写您的代码(不要成为早期优化的牺牲品!),以使编译器清楚您的代码应该具有什么逻辑结果的方式来做您希望它做的事情,并让它担心优化。所有编译器都对此类案例进行了大量的研究、记录和优化。
如果将来你需要更高性能的代码,你应该首先分析并找到瓶颈的确切位置(通常是,而不是你认为它可能在哪里),然后才开始使用hackery让它更快/更好地工作。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 从多个源构造一个对象,包括一个对象向量
- 为什么C++在将一个对象复制到另一个对象时需要对这两个对象进行低级常量限定
- 检查哪个对象调用了另一个对象的对象方法
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 包装一个对象并假装它是一个 int
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- 如何使用函数将一个对象的输入复制到另一个对象中
- 选择一个元素而不是一个对象的数组的原因
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 绘制一个对象,比较模具缓冲区的两个不同值