鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

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元素个数对函数执行过程的性能影响。