使用std::move是否有任何性能上的好处?
Does the use of std::move have any performance benefits?
请考虑以下代码:
#include <iostream>
#include <vector>
#include <utility>
std::vector<int> vecTest;
int main()
{
int someRval = 3;
vecTest.push_back(someRval);
vecTest.push_back(std::move(someRval));
return 0;
}
因此,据我所知,someRval
的值将在第一次调用push_back()
时复制到vecTest中,但在第二次调用someRval时产生x值。我的问题是,会有任何性能上的好处吗?我的意思是,可能不会对int
有任何好处,但在处理更大的对象时可能会有一些性能上的好处吗?
移动的性能优势通常来自于动态分配被排除。
考虑一个过度简化(且幼稚)的string
(缺少复制赋值操作符和移动赋值操作符):
class MyString
{
public:
MyString() : data(nullptr) {}
~MyString()
{
delete[] data;
}
MyString(const MyString& other) //copy constructor
{
data = new char[strlen(other.c_str()) + 1]; // another allocation
strcpy(data, other.c_str()); // copy over the old string buffer
}
void set(const char* str)
{
char* newString = new char[strlen(str) + 1];
strcpy(newString, str);
delete[] data;
data = newString;
}
const char* c_str() const
{
return data;
}
private:
char* data;
};
这一切都很好,但是如果字符串变长,这里的复制构造函数可能会很昂贵。然而,复制构造函数需要复制所有内容,因为它不允许触及other
对象,它必须完全按照其名称所述,复制内容。现在,如果你需要字符串的副本,这就是你必须付出的代价,但是如果你只想使用字符串的状态,而不关心之后会发生什么,你不妨移动它。
移动它只需要让other
对象处于一些有效状态,这样我们就可以使用other
中的一切,这正是我们想要的。现在,我们所要做的不是复制data
指针指向的内容只是将data
指针重新赋值给other
指针,我们基本上是在窃取other
的内容,我们也会很好地将原来的data
指针设置为nullptr
:
MyString(MyString&& other)
{
data = other.data;
other.data = nullptr;
}
好了,这就是我们要做的。这显然比复制构造函数那样复制整个缓冲区要快得多。
。
移动像int
甚至char*
这样的"原始"类型与复制它们没有什么不同。
复杂类型,如std::string
,可以使用您愿意牺牲源对象状态的信息,以使移动比复制更有效。
可以,但这取决于应用程序的细节——对象的大小和操作的频率。
将其转换为r值并移动它(通过使用std:move()
)可以避免复制。如果对象的大小足够大,这可以节省时间(例如,考虑一个具有1,000,000个双精度的数组-复制它通常意味着复制4 MB或更多内存)。
另一点是频率——如果你的代码经常执行相应的操作,它可以加起来相当可观。
一般来说,除非你需要优化,否则不要优化。
- 与纯 V8 相比,NodeJS 是否有任何性能缺陷或显著开销?
- 在类中始终使用此指针是否有任何性能成本
- 从交换机块返回时的任何性能差异
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- 任何性能问题都在qt框架中使用了stackedwidget的最大页面数
- 使用 const CString& 而不是单独使用 CString 作为函数参数是否有任何性能优势?
- 当使用不相等vs均等时,是否存在任何性能差异
- 重载运算符:常量与非常量返回类型:任何性能差异
- 在Windows上读取性能数据计数器是否需要任何特殊的安全权限
- 变量名称的长度是否会造成任何与性能或效率相关的问题
- 在类中包装int的任何性能惩罚
- Linux 性能监控,任何监视每个线程的方法
- HBase上的节俭是否有任何性能基准
- 静态关键字是否提供任何性能提升
- 从抽象类继承的抽象方法是否存在任何性能问题
- 可以使用 char[] 作为参数、返回等来解决任何性能问题
- std::copy 和容器的复制构造函数之间是否存在任何性能差异?
- 包含每个标头是否有任何性能影响
- 直接使用C++WinRT组件或C++XAML项目是否存在任何性能问题
- 以下任何配置都会影响发布版本的性能吗