c++程序性能优化学习

一.程序使用的内存区:

1.全局/静态数据区

2.常量数据区

3.代码区

4.栈:存储自动变量、局部变量、函数传递的参数值

5.堆:动态分配的数据,new--deletemalloc--free


全局变量作用于整个程序,在调用main函数之前被创建,退出main函数销毁全局变量。

静态变量是程序开始时 分配好了。对象第一次进入作用域时被创建,程序退出时被销毁。

 

.拷贝构造函数:

1.默认拷贝函数不操作静态数据,默认拷贝函数执行的是浅拷贝(有指针时,需要深拷贝,自己写拷贝构造函数) CExample(const CExample& C);

2.拷贝构造函数它必须的第一个参数是本类型的一个引用变量。

3.调用拷贝构造函数的情况:

1)对象以值传递的方式传入函数参数。例如void fun(Apple  C)

调用g_Fun()时,会产生以下几个重要步骤:

(a).test对象传入形参时,会先会产生一个临时变量,就叫 吧。

(b).然后调用拷贝构造函数把test的值给C。 整个这两个步骤有点像:CExample C(test);(3).g_Fun()执行完后析构掉 对象。

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[n];

     }

  ......

}

Int  main() {

  Apple  a(10);

  Apple  b=a;

}

对象bbuffer指向和a对象buffer相同的内存区,在a,b析构时,这块内存会释放两次。导致内存错误。

 

三.关于一个类的对象的大小:

(64linux系统下

1.静态成员函数和非静态成员函数不会影响内存大小

2.静态数据成员存储在全局/静态数据区,并不作为对象占据的内存的一部分

3.所有的对象共享一份静态数据成员,所以静态数据成员占据的内存的数量不会随对象数据的增加而增加。

4.如果对象中包含虚函数,会增加8个字节(指针大小)的空间,不管有多少个虚函数。C++编译器碰到虚函数时会分配一个指针指向一个函数地址表,即“虚函数表”。

5.非静态数据成员是影响对象占据内存大小的主要因素,随着对象数目的增加,非静态数据成员占据的内存也会相应增加。

6.虚函数表是在一个类实例的开始部分。虚函数用来实现面向对象中的多态性,在程序运行时,决定一个父类对象的指针调用的函数是父类还是子类中的实现。

 

四.字节对齐:

char--单字节对齐

short--两字节对齐

int--四字节对齐

long--八字节对齐

指针--八字节对齐

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值