C++对象模型笔记:对象实例内存布局的小小结

前一篇笔记中已经说出了类的对象实例在内存中的三种可能的内存布局,其中,最后一种是c++编译器正在使用的。这种布局的特点如下(先抛开虚函数方面的信息,说一般的)

 

1、非静态(non-static)数据成员,每个对象实例的内存空间里都有一份;

 

2、静态(static)数据成员,静态和非静态的成员函数:整个内存空间里面仅有一份(对象实例的内存空间是没有这方面的信息的)

 

原来,什么类的成员函数,什么类的静态数据成员啊,都是全局变量和全局函数啊,是不是有种受骗的感觉啊,搞了半天,什么都是C语言的东西啊?

 

C++ 的目标是什么?不就是为了追求C的效率嘛?要追求C的效率怎么办?只有用C了。C没有面向对象的封装机制,因此,就像用户提供了面向对象的语法,然后自己在背后将面向对象的东西转为C语言中的东西:全局变量,全局函数......所以,从本质上来说,下面的class point的定义:

 

 

经过编译器的转化之后,和下面的C代码没有什么不同:

 

 

所以,Point的一个对象实例pt在内存布局上,和C上面的struct Point是一样的,都是只有一个成员_x; 每个函数调用的开销都是也和你用C语言写的东西是一样的。

 

有两点需要说明一下:

 

1、 上面那个Point_PointCount()为什么不用传指针啊?因为在C++上面对应的是static int PointCount()static成员函数是没有this指针的,它只能访问static数据成员----对应到C的代码里面就是说,Point_PointCount()只访问上面的全局变量_point_count,所以就不需要传指针。

 

2 C++类里面那个privateprotected的优点在C里面没有体现出来啊?是的,但是你可以和你的开发团队里面约定只能过函数来访问结构体里面的成员,违者一次罚款50块钱,保证有效!!再说C++里面的限定符也不见得是绝对的安全(见我的笔记之:privateprotectedpublic

 

看见了吧?从某种角度来说,这个世界上根本就没有什么所谓面向对象,只不过说的人多了,也就有了面向对象;面向对象只是一种概念而已。离开了实现,它什么都不是~

 

或者也可以这样说,什么工具都用来做面向对象的方法,只要你应用得当;

 

可以说,我这一系列笔记的讲解的地方,都是围绕着这个观念来说明的----C++特有的语法细节,来说明一个与语言无关,与技术工具无关,与平台无关的一系列的技术思想(这大概就是传说中的置之死地而后生的方法......),这个就是我读Lippman这本书时的感受。

 

我这篇笔记,也没有什么新的技术讲解,纯粹是忽悠人的,呵呵。但是,如果能给某些新手以一些提示的话,就算忽悠,也有一点价值。

 

现在,问题来了:说类里面的成员函数其实是全局函数,你蒙谁呢你?如果那里真是全局函数,那么下面的两个类:

 

  

里面的成员函数都是print,怎么区分谁是谁啊???还有,如果真是全局函数,又怎么会有重载,运算符重载等等的东西啊?

 

......

 

...确实是一个问题,但是我也要问一下,以显得我在你们面前好像 很有学问的样子:你知道山高自有客行路,水深自有渡船人这句话是谁说的嘛?你知道什么叫做Name Mangling嘛?

 

欲知后事如何,请看下回分解,呵呵~

 

PS. “山高自有客行路,水深自有渡船人这句话,是在某本小说里面的主人公对他的师傅说的,那本小说只要是中国人都知道的,你们不妨猜上一猜,是谁说的?呵呵。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值