C++编译优化备忘
基于GCC测试:http://www.tutorialspoint.com/compile_cpp11_online.php
const A& a=fun() 与 A a= fun()
1、方法fun返回值为 const A& 时,前者比后者 减少一次拷贝构造
#include <iostream>
using namespace std;
class A
{
public:
A() {
cout << "--默认构造函数--" << endl;
}
A(const A& a) { cout << "--拷贝构造函数--" << endl; }
A & operator =(const A &a)
{
cout << "--赋值--" << endl;
return *this;
}
};
class Test
{
public:
const A& GetA(){ cout <<&m_a << endl; return m_a;}
private:
A m_a;
};
int main()
{
Test t;
A vec;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
const A& b=t.GetA();
cout <<&b << endl;
return ;
}
const &

2、方法fun返回值为 A 时,相同。只会生成一个临时变量
A GetA(){ cout <<&m_a << endl; return m_a;}

A GetA(){ A a;cout <<&a << endl; return a;}

未实现move构造的类:A a=std::move(fun()) 与 A a=fun()
1、方法fun返回值为 const A& 时,相同,都调用一次拷贝构造
class Test
{
public:
const A& GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b=std::move(t.GetA());
cout <<&b << endl;
return ;
}
move

2、方法fun返回值为 A,前者比后者多一次拷贝构造
class Test
{
public:
A GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b=std::move(t.GetA());
cout <<&b << endl;
return ;
}
move

未实现move构造的类:A a;a=std::move(fun()) 与 A a;a=fun()
与fun的返回值无关,均相同
class Test
{
public:
A GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a;
a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b;
b=std::move(t.GetA());
cout <<&b << endl;
return ;
}
赋值

const A& GetA(){ cout <<&m_a << endl; return m_a;}
const A&

C++编译优化备忘的更多相关文章
- QT开发编译问题备忘
编译<Qt及Qt Quick开发实战精解> 的代码,编译出错,提示: Cannot find file: E:\学习资料\QT\<Qt及Qt Quick开发实战精解>代码\sr ...
- css相关 细节 优化 备忘
<p>标签不能再包含<p>,也不能包含<div>,<div>可以包含<p> a 和 img 标签是特殊的行内元素,a标签可以包含div等,几 ...
- windows下matplotlib编译安装备忘
windows下,codeblocks,mingw安装matplotlib. python下一些源码的编译安装,备忘. matplotlib官网编译好的版本只支持到3.3.我不慎刚下了python3. ...
- opencv-2.4.11编译备忘
编译完成后,想测试example中例子,但是由于没有sudo权限,不能运行pkg-config查看opencv的--cflags和--libs. 记录一下,备忘: pkg-config --libs ...
- php 相关模块备忘
在安装php的时候,不管是编译安装: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
- 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因
近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...
- Nmap备忘单:从探索到漏洞利用(Part 5)
这是备忘单的最后一部分,在这里主要讲述漏洞评估和渗透测试. 数据库审计 列出数据库名称 nmap -sV --script=mysql-databases 192.168.195.130 上图并没有显 ...
- Nmap备忘单:从探索到漏洞利用(Part 4)
这是我们的Nmap备忘单的第四部分(Part 1. Part 2. Part 3).本文中我们将讨论更多东西关于扫描防火墙,IDS / IPS 逃逸,Web服务器渗透测试等.在此之前,我们应该了解一下 ...
- Nmap备忘单:从探索到漏洞利用(Part 2)
这是我们的第二期NMAP备忘单(第一期在此).基本上,我们将讨论一些高级NMAP扫描的技术,我们将进行一个中间人攻击(MITM).现在,游戏开始了. TCP SYN扫描 SYN扫描是默认的且最流行的扫 ...
随机推荐
- BZOJ.5092.[Lydsy1711月赛]分割序列(高维前缀和)
题目链接 \(Description\) \(Solution\) 首先处理\(a_i\)的前缀异或和\(s_i\).那么在对于序列\(a_1,...,a_n\),在\(i\)位置处分开的价值为:\( ...
- SpringCloud教程 | 第四篇:断路器(Hystrix)
在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...
- SVN-您的主机中的软件中止了一个已建立的连接
关于这个问题,网络上有各种解决的办法,关闭防火墙,HTTP/HTTPS切换,改端口... ...但我都试了没有用.本来一直用的好好的,突然就出现了这个问题,而且在几分钟前都是正常的.下面来说说我都干了 ...
- NOIP-无线网路发射器选址
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形成的网格状,并且相邻的平 ...
- Tornado-Form表单验证
基本思路 用户提交表单后,验证开始.页面中会有多个域要求验证,如text input,files, checkbox.同时,根据验证字段的不同,验证方式会有很多种,例如对邮箱.IP地址.电话的验证标准 ...
- BOM 浏览器对象模型_渲染引擎_JavaScript 引擎_网页加载流程
1. 浏览器核心的两个组成部分 渲染引擎 将网页代码渲染为用户视觉可以感知的平面文档 分类: Firefox Gecko 引擎 Safari WebKit 引擎 Chrom ...
- BOM 浏览器对象模型_window.navigator
window.navigator 对象 包含浏览器和系统信息的 Navigator 对象. 通过这个属性 了解用户的环境信息 window.navigator.userAgent 返回浏览器的 Use ...
- python语法_str_eval
dict1 = {} a = str(dict1) type(a) = 字符串 b = eval(a) type(b) = 字典
- day 22 二十二、面向对象导入、名称空间、类与对象
一.面向对象导入 1.含义: ①面向过程: 重过程:解决问题,考虑的是解决问题的流程 解决问题的思路清晰,但拓展性不强 ②面向对象: 重对象:解决问题,找到解决问题的对象 解决问题的思路可能不止一条( ...
- Lambda查询
使用EF查询数据库,之前使用Linq表达式,现在改成另一个种方法查询:Lambda表达式 TestEntities db=new TestEntities(); ).FirstOrDefault(); ...