c++拷贝构造和编译优化
#include <iostream> using namespace std; class MyClass
{
public:
MyClass();
MyClass(int i);
MyClass(const MyClass &c);
~MyClass(); //后面main中测试发现func1 和func2之后没有调用拷贝构造,应该是被优化了
MyClass func1(int i){
cout<<"func1"<<endl;
return MyClass(0);
}
MyClass func2(int i){
MyClass a;
cout<<"func2"<<endl;
return a;
} private:
int m_i; }; MyClass::MyClass()
{
m_i = 0;
cout << "MyClass()" << endl;
}
MyClass::MyClass(int i)
{
m_i = i;
cout << "MyClass(int i)" << endl;
} MyClass::MyClass(const MyClass &c)
{
m_i = c.m_i;
cout << "MyClass(const MyClass &c)" << endl;
} //这里调用了两次拷贝构造函数&c
MyClass test(const MyClass c)
{
cout << "test" << endl;
return c;
} MyClass::~MyClass()
{
cout<<"~"<<endl;
} int main()
{
MyClass c2;
cout << "-------------------------------" << endl;
MyClass c1=c2.func2(2);
cout << "-------------------------------" << endl;
MyClass c3=test(c2);
cout << "-------------------------------" << endl; return 0;
} //结果如下
MyClass()
-------------------------------
func1
MyClass(int i)
-------------------------------
MyClass()
func2
-------------------------------
MyClass(const MyClass &c)
test
MyClass(const MyClass &c)
~
-------------------------------
扩展
将拷贝构造函数声明为explicit,则会阻止隐式拷贝构造函数的调用.隐式拷贝构造函数的调用主要发生在三个点:
1.一个对象作为函数参数,以值传递的方式传入函数体.
2.一个对象作为函数返回值,以值传递的方式从函数返回.
3.以AAA = xxx的方式创建对象AAA,xxx为与AAA为同类型的对象.
因而,将拷贝构造函数声明成explicit并不是良好的设计,一般只将有单个参数的constructor声明为explicit,而copy constructor不要声明为explicit.
参考http://www.cnblogs.com/dwdxdy/archive/2012/07/17/2595479.html
c++拷贝构造和编译优化的更多相关文章
- C++基本函数的调用优化(构造、拷贝构造、赋值)
合理的函数可提升时间和空间的利用率 //Test1.h #include<iostream> using namespace std; struct ST { private: int a ...
- JVM编译优化
在部分的商用虚拟机中,Java 程序最初是通过解释器(Interpreter )进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为“热点代码”.为了提高热点代码的执 ...
- C++之旅:拷贝构造与友元
拷贝构造与友元 拷贝构造是在构造一个对象的时候将已有对象的属性拷贝给新的对象:友元可以让一个类的所有属性(主要是private)对特定的类开放 拷贝构造 如果没有复写拷贝构造函数,系统会帮我们默认生成 ...
- C++ 进阶5 拷贝构造 深度复制 运算符重载
C++ 进阶5 拷贝构造 深度复制 运算符重载 20131026 例子: 运行环境是G++ 编译, /* * main.cpp * * Created on: 2013年10月26日 * ...
- 一个关于C++拷贝构造的bug
#include <iostream> using namespace std; class A { public: A(int a) {}; A(const A&) = defa ...
- JVM性能优化系列-(5) 早期编译优化
5. 早期编译优化 早起编译优化主要指编译期进行的优化. java的编译期可能指的以下三种: 前端编译器:将.java文件变成.class文件,例如Sun的Javac.Eclipse JDT中的增量式 ...
- JVM性能优化系列-(6) 晚期编译优化
6. 晚期编译优化 晚期编译优化主要是在运行时做的一些优化手段. 6.1 JIT编译器 在部分的商用虚拟机中,java程序最初是通过解释器(Interpreter) 进行解释执行的,当虚拟机发现某个方 ...
- 15个问题自查你真的了解java编译优化吗?
摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了. 本文分享自华为云社区<你真的了解java编译优化吗?15个问题 ...
- GCC 编译优化指南(转)
GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...
随机推荐
- SSH框架的简单上传功能的实现
1.创建项目. 2.导入开发包. 3.配置web.xml. 配置内容就是配置struct2的内容如下: <?xml version="1.0" encoding=" ...
- maven打包jar包
参考http://www.cnblogs.com/justinzhang/p/4983633.html 新建jar类型的maven project (选择simple project ) 配置 < ...
- 他(he)(钟神)
他[问题描述]一张长度为N的纸带,我们可以从左至右编号为0 −N(纸带最左端标号为0) .现在有M次操作,每次将纸带沿着某个位置进行折叠,问所有操作之后纸带的长度是多少.[输入格式]第一行两个数字N, ...
- 关于ACM的总结
看了不少大神的退役帖,今天终于要本弱装一波逼祭奠一下我关于ACM的回忆. 从大二上开始接触到大三下结束,接近两年的时间,对于大神们来说两年的确算不上时间,然而对于本弱来说就是大学的一半时光.大一的懵懂 ...
- 【原】webp图片牛刀小试
其实今年很早就有接触到webp图片的概念,只是一直没怎么弄.今天在一个小项目中小用了一番.总结总结 采用 what,why,how的方式来总结 what? 什么是webp图片? 维基百科: ...
- easyui rowStyler属性
1.项目中示例 { idField : 'id', // 只要创建数据表格 就必须要加 ifField title : title, fit : true, url : top.baseUrl+ 'c ...
- vim as python IDE
参照Martin Brochhaus大神的视频,今天我也尝试了一下配置vim python IDE以后使用过程中只需要https://github.com/wyj1239630590/vim-as-a ...
- 引用js或css后加?v= 版本号的用法
<span style="font-size:14px;">css和js带参数(形如.css?v=与.js?v= 或 .css?version=与.js?version ...
- php二维数组相同id的数量相加
数组样式 $arr = array( array( , , , ), array( , , , ), array( , , , ), array( , , , ), ); 处理办法 $item=arr ...
- Docker 清理命令集锦
杀死所有正在运行的容器 复制代码代码如下: docker kill $(docker ps -a -q) 删除所有已经停止的容器 复制代码代码如下: docker rm $(docker ps -a ...