比较返回一个对象,到底该怎么写?

// 类型一
std::string getTimeNowString()
{string str = "2010-05-04";return str;
}// 类型二
std::string getTimeNowString()
{string str = "2010-05-04";return std::move(str);
}// 类型三
std::string& getTimeNowString()
{string str = "2010-05-04";return std::move(str);
}// 类型四:运行期崩溃
std::string&& getTimeNowString()
{string str = "2010-05-04";return std::move(str);
}

答案是:使用类型一即可,因为

在c++11以后,编译器自动执行了优化,只要该类型有移动构造函数即可保证效率。参见:

https://blog.csdn.net/zzhongcy/article/details/86703619?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

我们来测试一下效果是否一样,我们自己写一个类:

#define PRINT(a) cout << "行" << __LINE__ << "调用:"; aclass Base
{
public:int a;char * buf = NULL;void SetStr(const char * buffer){if (!buffer)return;if (buf)delete[] buf;buf = new char[strlen(buffer) + 1];strcpy(buf, buffer);}
public:Base() : a(1){cout << "构造0-行" << __LINE__ << "\n";}Base(int i) : a(i){cout << "构造1-行" << __LINE__ << "\n";}virtual ~Base(){cout << "析构\n";if (buf)delete[] buf;}public:Base(const Base& other) : a(other.a){SetStr(other.buf);cout << "拷贝构造-行" << __LINE__ << "\n";}Base & operator=(const Base& other) {this->a = other.a;SetStr(other.buf);cout << "拷贝赋值-行" << __LINE__ << "\n";return *this;}Base(Base&& other)  //  这里不能是const类型,因为可能要更改other,{this->a = other.a;this->buf = other.buf;other.buf = NULL;         // 交接堆数据空间cout << "转移构造-行" << __LINE__ << "\n";}Base & operator=(Base&& other) {this->a = other.a;this->buf = other.buf;other.buf = NULL;         // 交接堆数据空间cout << "转移赋值-行" << __LINE__ << "\n";return *this;}public:int getInt(){return a;}int && getRvalueInt(){// notice that it's fine to move a primitive type--remember, std::move is just a cast  return std::move(a);}};

类型一测试:

// 测试返回值问题
Base testReturn()
{Base base(1);base.SetStr("hello, world");cout << "__________" << endl;return base;
}int main()
{Base base1 = testReturn1();return 0;
}输出:
构造1-行48
__________
转移构造-行76
析构
析构

类型二测试:

// 返回前调用std::move()
Base testReturn2()
{Base base(1);base.SetStr("hello, world");cout << "__________" << endl;return std::move(base);
}

输出结果与之前的结果一模一样;

经过测试,动态数组也是一样的,不需要特别的写法;

std::vector<Base> vec;return vec;

c++11的函数返回值要不要std::move()相关推荐

  1. java 11:数组作为函数参数,数组做为函数返回值

    1 数组作为参数 我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数: 又如, [java] ...

  2. C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析

    右值引用保存临时变量(函数返回值)的问题 :临时变量是右值 1.普通变量接收函数返回值: 2.右值引用变量接收函数返回值: 3.用const int& 和右值引用是一样的效果,只是const ...

  3. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  4. C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)

    先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...

  5. C指针7:指针作为函数返回值

    C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> ...

  6. python函数用法详解2(变量的作用域(全局变量、局部变量)、共享全局变量、函数返回值、函数的参数(位置参数、关键字参数、默认参数、不定长参数)、拆包、交换变量值、引用、可变和不可变类型)

    1. 变量作⽤域         变量作⽤域指的是变量⽣效的范围,主要分为两类:局部变量和全局变量. 局部变量         定义在函数体内部的变量,即只在函数体内部⽣效. def testA(): ...

  7. 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)

    2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...

  8. python 函数返回值的特殊情况

    今天没事和大家一起聊聊python 函数返回值的特殊情况,之前我也碰到过类似方面的问题,到后来查阅了一些资料后,发现原来是这样! 我记得很久以前和大家聊过python列表操作方法,python列表非 ...

  9. JS一起学04:函数返回值、定时器、随机数、自动播放的幻灯片

    一.函数返回值----将相应的值返回到函数调用的地方 1. 可以不写返回值 2. 可以没有return,如果不返回,默认返回undefined 3. 本函数内,renturn之后的JS语句不再执行,跳 ...

最新文章

  1. java.io几种读写文件的方式
  2. GT Transceiver的复位与初始化(3)TX初始化和复位流程
  3. 如何给docker容器分配内存和cpu
  4. python【力扣LeetCode算法题库】14-最长公共前缀(列表解压)
  5. 深度学习解决多视图非线性数据特征融合问题
  6. 跨专业选修C语言看什么书,跨专业考研如何选择?!!!!!
  7. 为什么要用GCD-Swift2.x
  8. 笔记整理-知识产权与标准化知识-GB/T11457-2006软件工程术语
  9. java arraylist初始大小_Java - ArrayList默认初始值
  10. primefaces_懒惰的JSF Primefaces数据表分页–第2部分
  11. 独家对话谢宝友:做一款类似于 Linux 的国产操作系统 | 人物志
  12. 安全模式 提权_WEB安全第八章实战篇01 提权安全狗服务器
  13. 高大上必备!D3.js对产品的贡献度剖析
  14. 机器人动力学与参数辨识学习笔记(一)
  15. 2021年茶艺师(中级)免费试题及茶艺师(中级)模拟试题
  16. Ubuntu16.04+GT720M + Cuda8.0+py-faster-rcnn(caffe)
  17. 美的合肥荆州工厂均入选全球“灯塔工厂”;美国运通新版百夫长白金、黑金人民币卡将上市 | 美通企业日报...
  18. stem课程教学的设计
  19. Vue的Excel文件下载
  20. uefi安装win7,deepin15双系统后grub没有windows选项

热门文章

  1. Java引用(强引用和弱引用)
  2. Flask教程(五)GET和POST
  3. 私有化部署vs公有云部署,公私有别
  4. 重庆计算机上机操作试题,重庆市计算机等级考试C语言上机模拟试题
  5. 从零搭建Maven私有仓库
  6. PPT如何设置和取消打开密码?
  7. 【ShaderGraph】道路引导,小溪流水等UV动画效果
  8. python线程退出_python其中一个子线程,则退出全部线程,再退出进程
  9. 朋友创业5年,准备IPO了
  10. html字典模板,在flas中从html模板将字典保存到数据库