• 关于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++
  • 相关阅读:
    程序员需要的各种PDF格式电子书【附网盘免费下载资源地址】
    Web安全大揭秘
    tar 压缩解压命令详解
    django开发项目的部署nginx
    CentOS7安装mysql-python模块
    我的博客站点上线了
    2006
    centos7安装pip
    mysql删除匿名用户
    FilenameFilter 文件名过滤
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3162789.html
Copyright © 2020-2023  润新知