您的位置:首页 > 编程语言 > C语言/C++

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--八字节对齐

指针--八字节对齐
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: