为什么move开销更大
时间: 2023-08-23 08:43:03 浏览: 55
使用移动语义的开销比使用拷贝构造函数的开销更大的原因是,移动语义通常涉及到对原对象中资源的释放操作,以及对新对象中资源的重新分配和复制操作。
在只包含简单类型的 struct 对象中,使用移动语义的效果不如拷贝构造函数,因为简单类型的复制开销很小,而移动语义在复制简单类型时会额外进行内存分配和指针复制等操作,从而增加了开销。
此外,使用移动语义的前提是源对象不再被使用,所以在需要保留源对象的情况下,使用移动语义也会导致程序出错。因此,在只包含简单类型的 struct 对象中,不使用 move 语义是更为高效和安全的选择。
相关问题
简单类型的struct,使用move为什么开销更大
如果一个 struct 类型的对象只包含简单类型(如 int、float、double 等)或者指针类型,那么这个 struct 对象不具有可移动语义,因为简单类型或指针类型的对象的复制开销很小,使用移动语义反而会增加开销。在这种情况下,使用默认的拷贝构造函数和拷贝赋值运算符进行对象的复制和赋值即可,不需要使用 move 语义。
如果使用 move 语义对只包含简单类型的 struct 对象进行移动,可能会产生更大的开销。因为在移动构造函数或移动赋值运算符中,可能需要进行一些不必要的内存分配或指针复制操作,这些操作的开销可能比简单类型的复制操作更大。此外,在使用 move 语义时,需要保证源对象不再使用,否则会导致程序出错。
因此,在只包含简单类型的 struct 对象中,不使用 move 语义是更为高效和安全的选择。
简单struct,使用move移动语音,为什么开销更大, 并举例
对于简单的struct类型,使用移动语义通常不会引入额外的开销,因为struct类型的大小通常不会很大,也不包含指针等复杂类型。
下面是一个使用移动语义的简单struct类型的例子:
```c++
#include <iostream>
#include <chrono>
struct Point {
int x;
int y;
};
int main() {
Point p1 { 1, 2 };
auto start = std::chrono::steady_clock::now();
Point p2 = std::move(p1);
auto end = std::chrono::steady_clock::now();
std::cout << "time: " << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << " us" << std::endl;
return 0;
}
```
在上面的例子中,定义了一个简单的struct类型Point,包含了两个int类型的成员变量x和y。接着,定义了一个Point类型的变量p1,并将其初始化为{1, 2}。然后,使用std::move将p1的值移动到另一个Point类型的变量p2中。最后,输出移动的时间。
由于Point类型是一个简单的struct类型,其大小很小,且不包含指针等复杂类型,因此使用移动语义不会引入额外的开销。在上面的例子中,使用std::move移动p1的值到p2中的时间比直接将p1的值赋给p2的时间稍微长一些,但是开销非常小,可以忽略不计。
因此,对于简单的struct类型,不会引入额外的开销,使用移动语义可以提高性能。