深度探索C++对象模型之(三)

原文请参考:深度探索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++对象模型之(三))