c++程序性能优化学习
2014-06-05 18:01
246 查看
一.程序使用的内存区:
1.全局/静态数据区2.常量数据区
3.代码区
4.栈:存储自动变量、局部变量、函数传递的参数值
5.堆:动态分配的数据,new--delete,malloc--free
全局变量作用于整个程序,在调用main函数之前被创建,退出main函数销毁全局变量。
静态变量是程序开始时 分配好了。对象第一次进入作用域时被创建,程序退出时被销毁。
二.拷贝构造函数:
1.默认拷贝函数不操作静态数据,默认拷贝函数执行的是浅拷贝(有指针时,需要深拷贝,自己写拷贝构造函数) CExample(const CExample& C);2.拷贝构造函数它必须的第一个参数是本类型的一个引用变量。
3.调用拷贝构造函数的情况:
(1)对象以值传递的方式传入函数参数。例如void fun(Apple C)
调用g_Fun()时,会产生以下几个重要步骤:
(a).test对象传入形参时,会先会产生一个临时变量,就叫 C 吧。
(b).然后调用拷贝构造函数把test的值给C。 整个这两个步骤有点像:CExample C(test);(3).等g_Fun()执行完后, 析构掉 C 对象。
(2)对象以值传递的方式从函数返回.例如:Apple fun();
当g_Fun()函数执行到return时,会产生以下几个重要步骤:
(a). 先会产生一个临时变量,就叫XXXX吧。
(b). 然后调用拷贝构造函数把temp的值给XXXX。整个这两个步骤有点像:CExample XXXX(temp);(c). 在函数执行到最后先析构temp局部变量。
(d). 等g_Fun()执行完后再析构掉XXXX对象。
(3) 对象需要通过另外一个对象进行初始化
CExample B = A; //注意这里的对象初始化要调用拷贝构造函数,而非赋值
4.如果自己不定义拷贝构造函数,假设:
class Apple {
private:
char *buffer;
public:
apple(int n) {
buffer = new char
;
}
......
};
Int main() {
Apple a(10);
Apple b=a;
}
对象b的buffer指向和a对象buffer相同的内存区,在a,b析构时,这块内存会释放两次。导致内存错误。
三.关于一个类的对象的大小:
(64位linux系统下)1.静态成员函数和非静态成员函数不会影响内存大小。
2.静态数据成员存储在全局/静态数据区,并不作为对象占据的内存的一部分。
3.所有的对象共享一份静态数据成员,所以静态数据成员占据的内存的数量不会随对象数据的增加而增加。
4.如果对象中包含虚函数,会增加8个字节(指针大小)的空间,不管有多少个虚函数。C++编译器碰到虚函数时会分配一个指针指向一个函数地址表,即“虚函数表”。
5.非静态数据成员是影响对象占据内存大小的主要因素,随着对象数目的增加,非静态数据成员占据的内存也会相应增加。
6.虚函数表是在一个类实例的开始部分。虚函数用来实现面向对象中的多态性,在程序运行时,决定一个父类对象的指针调用的函数是父类还是子类中的实现。
四.字节对齐:
char--单字节对齐short--两字节对齐
int--四字节对齐
long--八字节对齐
指针--八字节对齐
相关文章推荐
- java学习--Java程序性能优化技巧
- JAVA程序性能优化-让你的java程序更快、更稳定学习笔记一性能优化一般步骤
- 改善C++ 程序的150个建议学习之建议10:优化结构体中元素的布局
- 改善C++ 程序的150个建议学习之建议35:使用内存池技术提高内存申请效率与性能
- 程序性能的初步优化与分析(以 C++ 为例)
- c++程序大数据量处理性能优化
- java程序性能优化学习总结--第一章java性能调优概述
- c++程序性能的初步优化与分析
- 向360手机卫士学习如何优化android程序性能
- 用 PGO 对C++程序执行性能进行优化
- java程序性能优化学习笔记day1
- [C++应用程序性能优化]程序使用内存区
- [C++应用程序性能优化]内存分配失败处理
- 读了两本关于C++程序性能优化的书
- 如何优化JAVA程序开发,提高JAVA性能
- [学习笔记] ASP.NET应用程序性能优化
- Java程序性能优化
- 如何优化JAVA程序开发,提高JAVA性能
- delphi中使用指针优化程序性能
- 使用GProf来优化你的C/C++程序