c++11的函数返回值要不要std::move()
比较返回一个对象,到底该怎么写?
// 类型一
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()相关推荐
- java 11:数组作为函数参数,数组做为函数返回值
1 数组作为参数 我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数: 又如, [java] ...
- C++11 右值引用与常量左值引用保存临时变量(函数返回值)的底层分析
右值引用保存临时变量(函数返回值)的问题 :临时变量是右值 1.普通变量接收函数返回值: 2.右值引用变量接收函数返回值: 3.用const int& 和右值引用是一样的效果,只是const ...
- C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)
引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...
- C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)
先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...
- C指针7:指针作为函数返回值
C语言允许函数的返回值是一个指针(地址),我们将这样的函数称为指针函数.下面的例子定义了一个函数 strlong(),用来返回两个字符串中较长的一个: #include <stdio.h> ...
- python函数用法详解2(变量的作用域(全局变量、局部变量)、共享全局变量、函数返回值、函数的参数(位置参数、关键字参数、默认参数、不定长参数)、拆包、交换变量值、引用、可变和不可变类型)
1. 变量作⽤域 变量作⽤域指的是变量⽣效的范围,主要分为两类:局部变量和全局变量. 局部变量 定义在函数体内部的变量,即只在函数体内部⽣效. def testA(): ...
- 2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码)
2020-09-22C++学习笔记之引用1(1.引用(普通引用)2.引用做函数参数 3.引用的意义 4.引用本质5.引用结论 6.函数返回值是引用(引用当左值)7测试代码) 1.引用(普通引用) 变量 ...
- python 函数返回值的特殊情况
今天没事和大家一起聊聊python 函数返回值的特殊情况,之前我也碰到过类似方面的问题,到后来查阅了一些资料后,发现原来是这样! 我记得很久以前和大家聊过python列表操作方法,python列表非 ...
- JS一起学04:函数返回值、定时器、随机数、自动播放的幻灯片
一.函数返回值----将相应的值返回到函数调用的地方 1. 可以不写返回值 2. 可以没有return,如果不返回,默认返回undefined 3. 本函数内,renturn之后的JS语句不再执行,跳 ...
最新文章
- java.io几种读写文件的方式
- GT Transceiver的复位与初始化(3)TX初始化和复位流程
- 如何给docker容器分配内存和cpu
- python【力扣LeetCode算法题库】14-最长公共前缀(列表解压)
- 深度学习解决多视图非线性数据特征融合问题
- 跨专业选修C语言看什么书,跨专业考研如何选择?!!!!!
- 为什么要用GCD-Swift2.x
- 笔记整理-知识产权与标准化知识-GB/T11457-2006软件工程术语
- java arraylist初始大小_Java - ArrayList默认初始值
- primefaces_懒惰的JSF Primefaces数据表分页–第2部分
- 独家对话谢宝友:做一款类似于 Linux 的国产操作系统 | 人物志
- 安全模式 提权_WEB安全第八章实战篇01 提权安全狗服务器
- 高大上必备!D3.js对产品的贡献度剖析
- 机器人动力学与参数辨识学习笔记(一)
- 2021年茶艺师(中级)免费试题及茶艺师(中级)模拟试题
- Ubuntu16.04+GT720M + Cuda8.0+py-faster-rcnn(caffe)
- 美的合肥荆州工厂均入选全球“灯塔工厂”;美国运通新版百夫长白金、黑金人民币卡将上市 | 美通企业日报...
- stem课程教学的设计
- Vue的Excel文件下载
- uefi安装win7,deepin15双系统后grub没有windows选项