关于C++中Object所占内存空间探索1

关于C++中Object所占内存空间探索(一)

有如下问题:

1. 一个空类,

class X{ };

2.类中含有数据成员(Data Member),

复制代码
class X
{
public:
    //Functions
private:
    int val;
    char bit1;
};
复制代码

3. 类中含有数据成员(Data Member)和虚函数,

复制代码
class X
{
public:
    virtual void test();
    //Other Functions
private:
    int val;
    char bit1;
};
复制代码

分别对以上三个类求sizeof(X)的大小。这问题有些简单,本人第一次看到的时候也觉得很简单,空类嘛,占内存1个字节(这老师有讲过,记得很清楚),而2和3我的答案是5,sizeof(int)+sizeof(char)=4+1=5,这不是很简单的问题吗?

可惜错了。

在C++中,一个类Object所占的内存空间是由类中定义的数据成员(Data Member)以及与虚函数(Virtual Function)有关。这样说或者还不够准确,因为就像在第二个问题中,class X对象所占的内存空间是8个字节,这是由于机器的问题。

在学C++时,老师一直都在强调一个空类对象所占的内存空间是1bit,所以一直记得。但是到底为什么是1bit就不得而知(不知道有那个大学老师有说明白这个问题)。

为什么空类所占的内存空间不是0bit而是1bit呢?

这1bit大小的内存空间是编译器插进去的一个char,其作用是使得此类的两个Object可以在内存中分配独一无二的地址。

还有对于第二个class X,其数据成员的内存模型如下:

这就是说,一个X对象大小都是8bit,val 占4bit,bit1 占1bit, 填充占3bit。

这里的填充是为了将内存数值调到某个数的整数倍,因为是32bit的机器,所以是4的倍数。

而对于第三个class X,除了数据成员之外还有一个虚函数是需要占用内存的。因为虚函数是靠虚函数表索引,所以需要加多一个指针的内存空间,因此这个的X的对象的大小是12bit。

梦之所寄,行之所为,地狱之门为之洞开!
 
分类: C/C++
标签: C/C++
原文地址:https://www.cnblogs.com/Leo_wl/p/3162789.html