深度探索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 于东软大连