C++基础复习提升-sizeof那些事

本文详细探讨了C++中关于内存管理和虚函数的相关知识点,包括空类的大小、虚函数与类大小的关系、虚指针的占用、继承与内存布局以及字节对齐的影响。通过实例解析了不同继承方式下类的大小计算,揭示了C++对象内存结构的秘密。
摘要由CSDN通过智能技术生成

参考C++那些事-光城大佬的网站
上一篇C++基础复习提升-inline那些事
下一篇C++基础复习提升-纯虚函数和抽象类那些事
结构体对齐(字节对齐)规则及大小计算

1.1空类的大小为1字节

//inline.h
#ifndef TEST

class A {
public:
    A() {};
};

#endif
//main.cpp
#include <iostream>
#include "inline.h"

using namespace std;

int main() {
	// sizeof:1
    cout << sizeof(A) << endl;
    return 0;
}

1.2一个类中,虚函数本身、成员函数(包括静态与非静态)和静态成员变量都是不占用类对象的存储空间的

//inline.h
#ifndef TEST

//静态数据成员被编译器放在程序的一个global data members中,
//它是类的一个数据成员,但不影响类的大小。
//不管这个类产生了多少个实例,还是派生了多少新的类,静态数据成员只有一个实例。
//静态数据成员,一旦被声明,就已经存在。
class A {
public:

    //虚函数vptr大小为8
    virtual void func() {};
    static int c;
    static int a;
    static int d;
};

#endif
//main.cpp
#include <iostream>
#include "inline.h"

using namespace std;

int main() {
	//sizeof:8
    cout << sizeof(A) << endl;
    return 0;
}

1.3对于包含虚函数的类,不管有多少个虚函数,只有一个虚指针,vptr的大小

//inline.h
#ifndef TEST

//静态数据成员被编译器放在程序的一个global data members中,
//它是类的一个数据成员,但不影响类的大小。
//不管这个类产生了多少个实例,还是派生了多少新的类,静态数据成员只有一个实例。
//静态数据成员,一旦被声明,就已经存在。
class A {
public:
    virtual void fun() {};

    virtual void fun1() {};

    virtual void fun2() {};

};

#endif
//main.cpp
#include <iostream>
#include "inline.h"

using namespace std;

int main() {
    // sizeof:8
    cout << sizeof(A) << endl;
    return 0;
}

1.4普通继承,派生类继承了所有基类的函数与成员,要按照字节对齐来计算大小(比较时需注意和字节长度小的比较)

//inline.h
#ifndef TEST

#pragma pack(4)

class A {
public:
    char a;
    int b;

};


class B : A {
public:
    short a;
    long b;
};

#pragma pack()

#endif
//main.cpp
#include <iostream>
#include "inline.h"

using namespace std;

int main() {
    // sizeof:8
    cout << sizeof(A) << endl;
    // B字节对齐(默认大小4) sizeof:16
    // char a;
    // int b;
    // short a;
    // long b;
    cout << sizeof(B) << endl;
    // sizeof:12
    cout << sizeof(C) << endl;
    // sizeof:4
    cout << sizeof(long) << endl;
    return 0;
}

1.5虚函数继承,不管是单继承还是多继承,都是继承了基类的vptr。(32位os4字节,64位os8字节)

//inline.h
#ifndef TEST

#pragma pack(4)

class A {
public:
    char a;
    int b;

};

class C {
    // sizeof : 8
    A a;
    // 补位到12%4==0;
    char c;
};

class A1 {
    virtual void fun() {}
};

class C1 : public A {
};

#pragma pack()

#endif
//main.cpp
#include <iostream>
#include "inline.h"

using namespace std;

int main() {
    // sizeof : 12
    cout << sizeof(C) << endl;
    // 对于虚单函数继承,派生类也继承了基类的vptr,sizeof为8
    cout << sizeof(C1) << endl;
    return 0;
}

1.6虚继承,继承基类的vptr

//inline.h
#ifndef TEST

#pragma pack(4)

class A {
    virtual void func() {};
};

class B {
    virtual void func3() {};
};

//派生类虚继承多个虚函数,会继承所有虚函数的vptr
class C : virtual public A, virtual public B {
    virtual void func2() {};
};

#pragma pack()

#endif
//main.cpp
#include <iostream>
#include "inline.h"

using namespace std;

int main() {
    // 多继承两个虚基类,sizeof:8+8 vptr:8
    cout << sizeof(C) << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值