• C++中将 sizeof() 用于类


    C++中将 sizeof() 用于类

    您知道,通过使用关键字 class 声明自定义类型,可封装数据属性和使用数据的方法。运算符 sizeof( )用于确定指定类型需要多少内存,单位为字节。这个运算符也可用于类,在这种情况下,它将指出类声明中所有数据属性占用的总内存量,单位为字节。 sizeof( )可能对某些属性进行填充,使其与字边界对齐,也可能不这样做,这取决于您使用的编译器。用于类时, sizeof() 不考虑成员函数及其定义的局部变量,如以下示例程序所示:

    #include 
    #include 
    using namespace std;
    
    class MyString
    {
    private:
        char* buffer;
    
    public:
        MyString(const char* initString) // default constructor
        {
            buffer = NULL;
            if(initString != NULL)
            {
                buffer = new char [strlen(initString) + 1];
                strcpy(buffer, initString);
            }
        }
    
        MyString(const MyString& copySource) // copy constructor
        {
            buffer = NULL;
            if(copySource.buffer != NULL)
            {
                buffer = new char [strlen(copySource.buffer) + 1];
                strcpy(buffer, copySource.buffer);
            }
        }
    
        ~MyString()
        {
            delete [] buffer;
        }
    
        int GetLength() 
        { return strlen(buffer); }
    
        const char* GetString()
        { return buffer; }
    };
    
    class Human
    {
    private:
        int age;
        bool gender;
        MyString name;
    
    public:
        Human(const MyString& InputName, int InputAge, bool InputGender)
            : name(InputName), age (InputAge), gender(InputGender) {}
    
        int GetAge ()
        { return age; }
    };
    
    int main()
    {
        MyString mansName("Adam");
        MyString womansName("Eve");
    
        cout << "sizeof(MyString) = " << sizeof(MyString) << endl;
        cout << "sizeof(mansName) = " << sizeof(mansName) << endl;
        cout << "sizeof(womansName) = " << sizeof(womansName) << endl;
    
        Human firstMan(mansName, 25, true);
        Human firstWoman(womansName, 18, false);
    
        cout << "sizeof(Human) = " << sizeof(Human) << endl;
        cout << "sizeof(firstMan) = " << sizeof(firstMan) << endl;
        cout << "sizeof(firstWoman) = " << sizeof(firstWoman) << endl;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    使用 32 位编译器的输出:

    sizeof(MyString) = 4
    sizeof(mansName) = 4
    sizeof(womansName) = 4
    sizeof(Human) = 12
    sizeof(firstMan) = 12
    sizeof(firstWoman) = 12
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用 64 位编译器的输出:

    sizeof(MyString) = 8
    sizeof(mansName) = 8
    sizeof(womansName) = 8
    sizeof(Human) = 16
    sizeof(firstMan) = 16
    sizeof(firstWoman) = 16
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    分析:
    这个示例很长,它包含 MyString 类和 Human 类。其中的 Human 类使用 MyString 对象来存储姓名( name),并新增了 bool 数据成员 gender。
    首先来分析输出。从中可知,将 sizeof( )用于类及其对象时,结果相同。 sizeof(MyString) 和 sizeof(mansName)的值相同,因为类占用的字节数在编译阶段就已确定。虽然 mansName 包含 Adam,而 womanName 包含 Eve,但它们占用的字节数相同,这没什么可奇怪的,因为存储姓名的 MyString::buffer 是一个 char *,这是一个大小固定的指针(在 32 位系统中,为 4 字节),而与指向的数据量无关。
    将 sizeof( )用于 Human 时,结果为 12。第 44~46 行表明, Human 包含一个 int 成员、一个 bool 成员和一个 MyString 成员。要获悉内置类型占用的字节数。从该程序清单可知, int 占用 4 字节, bool 占用 1 字节,而 MyString 占用 4 字节。它们的总和与输出中的 12 字节不符,这是因为 sizeof( )的结果受字填充( word padding)和其他因素的影响。

    该文章会更新,欢迎大家批评指正。

    推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
    分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
    fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
    TCP/IP,协程,DPDK等技术内容
    点击立即学习:C/C++后台高级服务器课程

  • 相关阅读:
    HBase 知识手册
    手搭手Ajax经典基础案例省市联动
    Linux文件/目录所属组修改
    源码解析FlinkKafkaConsumer支持punctuated水位线发送
    代码随想录 动态规划Ⅳ
    图论(链式前向星、最短路、最小生成树)
    【javaSE】 枚举与枚举的使用
    2022年全球市场BVM袋阀面罩总体规模、主要生产商、主要地区、产品和应用细分研究报告
    倒序数(模拟)
    PyQt5(一) PyQt5安装及配置,从文件夹读取图片并显示,模拟生成素描图像
  • 原文地址:https://blog.csdn.net/qq_41317716/article/details/134498304