STL等复杂结构的操作时,优先采用移动语义,避免不必要的赋值拷贝等操作
【说明】 C++11标准引入了对移动语义的支持,而STL等复杂数据结构,其实现机制上对动态内存(或内存池等)等资源有深度依赖;实际编码过程中,涉及STL等复杂数据结构的操作时,可以按需使用移动语义,减少对绑定在其上的动态内存数据复制开销。
【原理】 C++支持的移动语义,是针对绑定了资源的对象(如STL使用中绑定了动态内存),在对象间转移资源所有权的过程;如果是自定义的class或struct,需要结合实际情况(即是否存在资源所有权的控制)决策是否定义移动操作方法。移动操作方法的具体定义如下:
class ResourceItem {
public:
...
ResourceItem(ResourceItem &&rhs) noexcept
{
// 移动构造方法实现,实现资源所有权从rhs到本对象的转移
}
ResourceItem &operator=(ResourceItem &&rhs) noexcept
{
// 移动方法实现,实现资源所有权从rhs到本对象的转移
}
...
};
【注意事项】 不涉及
【案例】
优化前:
using SomeType = std::vector<int32_t>;
void SwapSomeType(SomeType &a, SomeType &b)
{
SomeType temp(a);
a = b;
b = temp;
return;
}
说明:上述SwapSomeType函数用于交换两个SomeType类型的对象,其中SomeType类型对象是一个int32_t类型vector,在SwapSomeType函数的执行过程中,存在1次拷贝构造过程和2次赋值过程,如果入参a和b包含的元素个数比较多时,函数执行开销较大。
优化后:
using SomeType = std::vector<int32_t>;
void SwapSomeType(SomeType &a, SomeType &b)
{
SomeType temp(std::move(a));
a = std::move(b);
b = std::move(temp);
return;
}
说明:修改后,SwapSomeType函数执行过程中,存在1次移动构造和2次移动过程,避免了对象a和b元素个数对函数执行过程的性能影响。
父主题: C++语言