MyC++之类对象内存分布

 

又有一段时间没写笔记了,最近放下了老师那边的项目,原因很简单:做自己想做的事就好。 

如果做一件自己不感兴趣的事,总是力不从心,效率太低,所以我是还是继续我的C++学习之旅,回到正题。。。

如题所述,对象的概念大家都了解,对象的创建有三种方式:

1.通过定义变量创建对象

2.临时对象的创建

3.动态创建对象(New)

创建的方式不同,他们的生命周期也就不同,而生命周期由作用域决定,就第一种而言,可细分为全局、静态、局部对象

全局、静态对象创建于编译时期,同整个程序的生命周期相同,但是全局对象的作用域为整个程序,而静态对象不是,但

它们都是存储在全局/静态数据区中

然后,局部对象与临时对象都是存在于栈中,什么是临时对象?就是不在源码级的对象,还不懂?ok,上例子:

在类中一般都会隐含默认拷贝构造函数,当我们要调用一个函数,而该函数的形参为类的一般对象,就像这样:

string Getname(STudent s);

其中STudent为一个类

当我们调用该函数:string name = Getname(student);

student为一个STudent的对象

传递给s的不是student对象本身而是它的一个副本,这也就会调用默认拷贝构造函数来创建一个临时对象,而这个创建过程并没有在源码里显现出来

像这种方式产生的对象都是临时对象,所以啊。。。应该尽量地杜绝产生临时对象,你想啊,要是要传递的对象很大,或者是在派生的最底端,卧槽...那就悲剧了,不仅耗时、耗内存,还容易造成内存泄露,办法呢?可以用应用嘛。扯远了。。。

一看到new,自然很熟悉,前面讲过动态创建的对象或变量存放在堆中,它的生命周期自然在delete后才结束,或者在程序结束后,暴力的了结它

谈到内存分布,对象所占内存的大小也是个好奇的问题,举个例子:

class STudent

{

    public:int age;'

              char name:

              static int ID;

              STudent();

       char GetName();

       static int GetAge();

       virtual int GetID();

};

这个类可以说已经很丰富了,它既有静态变量、非静态变量、虚函数、静态函数...

那这个类的一个对象占多大内存呢,你用sizeof()看下是12个字节,如何得之?

age是4个字节,然后name本来是一个字节,但是为了和age对其,也将它扩充为4个字节,然后ID是静态成员变量,存储在全局/静态数据区,不算在对象所占内存中。然后就剩下了那些函数,其中还隐含了一些默认函数,一眼看去这些函数肯定不止4个字节,然后我就一个个地将函数删除,看会不会影响它的大小,终于在将虚函数删除后,它的大小变成了8个字节,当时我还猜测是不是和函数的返回类型有关呢,其实错了,其实这4个字节是一个指针所占的空间,一个指向虚函数表的指针,所以不管你类中有多少个虚函数,只会有一个这样的指针,而已派生类中虚函数也共用这个指针,但其他的函数不占空间吗?其实,这些函数在编译后,只是将它们的函数名“加以修饰”,以前说过的函数重载就是根据修饰后的函数名而确定。所以..谜团解除了。

当然此后的子类对象的内存大小和上述的规则差不多,自己可以去试试看,只有了解了对象在内存中的管理,你才能很好将一个程序进行优化,使它尽可能地少重复开辟空间和释放空间。先说到这里了。。。

 

 

 

 

      工欲善其事,必先利其器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值