C++中vector返回值的最高效返回

返回值优化(RVO)

std::vector<int> get_vector()
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    return v;   // 依赖编译器进行返回值优化,消除多余的拷贝
}

虽然看起来像是在返回一个局部变量(通常会引发拷贝或者移动)
实际上大多数现代C++编译器都会对这种情况进行优化,直接在返回的位置上构造这个vector,避免了不必要的拷贝。

移动语义(C++11 后可用)

std::vector<int> get_vector()
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    return std::move(v);   // std::move 会将 v 标记为可移动,这样返回时就会调用移动构造函数,而不是拷贝构造函数
}

通过调用std::move,会导致v成为右值,进而触发vector的移动构造而非拷贝构造,避免了不必要的内存拷贝。

移动构造和拷贝构造的区别

拷贝构造函数是用另一个同类型的对象来初始化新创建的对象。拷贝构造函数通常会创建一个新的对象,并从现有对象复制所有数据到新对象。
移动构造函数:移动构造函数是用于把资源(例如动态分配的内存)从一个对象转移到另一个对象,原对象将不再拥有这些资源。在执行移动构造函数后,原对象通常会处在一个有效但未定义的状态。

共同点:都用于初始化一个类类型的对象

拷贝构造函数会创建一个原对象的副本
移动构造函数只是将原对象的资源转移给新对象,而不是复制它们

拷贝构造函数用于对现有对象进行复制操作,移动构造函数通常用于优化这种复制操作
通过“窃取”临时对象(例如函数返回的临时对象)的资源,减少不必要的临时对象的创建和销毁

在处理动态内存分配的大对象时,使用移动构造函数通常比使用拷贝构造函数更有效
因为移动构造函数只是转移已分配的内存,而不需要分配新的内存。

总结

对于现代C++,返回局部对象并不会引发性能问题,编译器通常会采取RVO/NRVO(返回值优化/命名返回值优化)
来避免多余的拷贝,对于C++11及之后的版本,利用移动语义同样可以获得高效的返回。

相关推荐

  1. C++vector返回高效返回

    2023-12-25 08:14:02       37 阅读
  2. C++返回返回引用、返回地址

    2023-12-25 08:14:02       37 阅读
  3. C++】表达式返回数据类型

    2023-12-25 08:14:02       36 阅读
  4. C#返回多个方法

    2023-12-25 08:14:02       8 阅读
  5. 从函数返回

    2023-12-25 08:14:02       25 阅读
  6. C#调用C++函数并返回const char*类型

    2023-12-25 08:14:02       34 阅读
  7. golang函数返回

    2023-12-25 08:14:02       39 阅读
  8. Spring MVC方法返回!!!

    2023-12-25 08:14:02       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-25 08:14:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-25 08:14:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-25 08:14:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-25 08:14:02       20 阅读

热门阅读

  1. Python(四十九)——requests和httpx

    2023-12-25 08:14:02       28 阅读
  2. JDBC连接Mysql数据库

    2023-12-25 08:14:02       31 阅读
  3. 将ncnn及opencv的mat存储成bin文件的方法

    2023-12-25 08:14:02       37 阅读
  4. [英语单词] piss in the wind

    2023-12-25 08:14:02       39 阅读
  5. 利用std::unique_ptr释放资源

    2023-12-25 08:14:02       37 阅读
  6. 喝酒、工作与自律

    2023-12-25 08:14:02       40 阅读
  7. 设计循环队列

    2023-12-25 08:14:02       45 阅读
  8. Milvus向量数据库基础用法及注意细节

    2023-12-25 08:14:02       47 阅读
  9. 力扣56.合并区间

    2023-12-25 08:14:02       36 阅读
  10. ARM AArch64的TrustZone架构详解(上)

    2023-12-25 08:14:02       35 阅读
  11. 阿里云公有云平台

    2023-12-25 08:14:02       36 阅读
  12. Iceberg: COW模式下的MERGE INTO的执行流程

    2023-12-25 08:14:02       36 阅读