深度探索C++对象模型之(三)
来源:互联网 发布:java ssh 上传文件 编辑:程序博客网 时间:2024/05/17 03:24
原文请参考:深度探索C++对象模型之(三)
请关注:JellyThink | 思想的果冻
C++中的多肽这个概念,如果往开了说,那就太广了,而很多时候又有很多的地方,我们在实际开发中没有用到,所以记录最简单的,最实用的C++多肽概念和用法,最后得到一个升华。
有下述代码一段:
#include <iostream>using namespace std; class A{public: A(){} virtual ~A(){} virtual void print() { cout<<"I am from class A"<<endl; }}; class B:public A{public: B(){} ~B(){} void print() { cout<<"I am from class B"<<endl; }}; void call(A a3, A *a4, A &a5){ (*a4).print(); // call whose print??? a5.print(); // call whose print??? a3.print(); // call whose print???} int _tmain(int argc, _TCHAR* argv[]){ A *a1 = new B(); a1->print(); // call whose print??? A a2; a2.print(); // call whose print??? B b2; call(b2, &b2, b2); delete a1; return 0;}
在上述代码中标注的call whose print???,如果都能正确的回答出,就对这里的知识点有很好的掌握。经过指针和引用完成的两个函数的调用会被动态的完成,也就是说(*a4).print()和a5.print()在执行期间是无法决定调用哪个print()函数的;为什么a3.print()总是调用A类的print()函数呢?为什么是动态决定的?请参见后续的(深度探索C++对象模型之(四))
一个class object到底需要多少内存才能放下呢?关于这个问题,真的很重要,因为编程,归根到底就是对内存的处理,如果对类对象的内存分布有很好的掌握,那么学习C++是件很容易的事情,处理bug也是很容易的,写出效率高的程序也是指日可待的,因为写出效率高的程序还要更多的练习。
- 那么到底需要多少内存呢?一般来说:
- 类中非static对象的类数据成员的大小的总和;
- 可能涉及到内存对齐时,而多添加的内存空间;这个在后续会有更详细的讲解;
- 类为了对irtual的支持,而额外的添加的内存空间,比如指向虚函数表的指针等;
这里,永远记住一条,一个指针,不管指向的是什么数据类型,指针本身所需要的内存字节是固定的(4个字节);通常,一个引用是以一个指针来实现的,后续的博文会对引用是以一个指针来实现的进行更详细的讲解。
以下的这个类,需要多少内存空间来建立一个对象:
class Test{public: Test(){} virtual ~Test(){} virtual void print() { cout<<"Test"<<endl; } static int count; protected: int number; // 4 char *name; // 4 private: int numberofcomponent; // 4 char *address; // 4};
表面一看,貌似只需要16字节而已,实际是20字节,为什么呢?想想一个class object到底需要多少内存空间的第2点。如果,在添加一个char类型的变量呢?如下:
class Test{public: Test(){} virtual ~Test(){} virtual void print() { cout<<"Test"<<endl; } static int count; protected: int number; // 4 char *name; // 4 private: int numberofcomponent; // 4 char *address; // 4 char sex; // 1};
现在需要多少内存空间呢?你会说17?21?No.NO.都不会,再想想一个class object到底需要多少内存空间的第3点。如果再把类中的virtual关键字去掉呢?那会需要多少内存空间呢?对于一个class object对内存的占用,后续还会进行更深层次的讨论,这些内容是每一个C++程序员必须会,不得不会的内容。
原文请参考:深度探索C++对象模型之(三)
请关注:JellyThink | 思想的果冻
2013/1/2 于东软大连
- 深度探索C++对象模型之(三)
- 深度探索c++对象模型之三 --- Data语意学
- 【C++】深度探索C++对象模型之Function语意学
- 深度探索C++对象模型笔记(三)
- 深度探索C++对象模型(三)Data语意学
- 《深度探索C++对象模型》读书笔记(三)
- 深度探索C++对象模型
- 【C++】深度探索C++对象模型之站在对象模型的顶端
- 《深度探索C++对象模型》系列之(一)
- 《深度探索C++对象模型》系列之(二)
- 深度探索C++对象模型之(四)
- 深度探索C++对象模型之(五)
- 深度探索C++对象模型之(六)
- 深度探索C++对象模型之(七)
- 深度探索C++对象模型之(八)
- 深度探索C++对象模型之(九)
- 深度探索C++对象模型之前言
- 深度探索C++对象模型之C++对象模型笔记
- elipse run error
- Linux 2.6内核中新的锁机制--RCU
- 2013寒假学习计划
- LWIP 无OS RAW-API UDP实例
- cookie原理详解
- 深度探索C++对象模型之(三)
- c-free minGW同时安装后会出错 解决方法
- 自适应网页设计(Responsive Web Design)
- C++之模板使用实例(一)
- 深入JVM系列(一)之内存模型与内存分配
- ubuntu各文件夹简介
- 分享国内的几个新意的网站
- 奥巴马筹款网站的制作过程
- AIR Program installation failure: "invalid package signature"