怎么计算一个类的大小 (C++)

在 C++ 中,计算一个类(class)的大小通常使用 sizeof 运算符。不过类的大小不仅仅是成员变量的简单相加,还会受到 内存对齐(padding / alignment)虚函数 等因素影响。

下面详细讲解。


一、最基本方法:sizeof

#include <iostream>
using namespace std;

class A {
public:
    int a;
    char b;
};

int main() {
    cout << sizeof(A) << endl;
}

输出可能是:

8

虽然:

int = 4
char = 1

理论大小:

4 + 1 = 5

但实际是 8,原因是 内存对齐


二、类大小的计算规则

一般遵循 成员大小 + 内存对齐 + 特殊成员

主要规则:

1 成员变量大小相加

class A {
    int a;   //4
    double b;//8
};

理论:

4 + 8 = 12

但要考虑对齐。


2 内存对齐(Padding)

编译器会按照 最大成员的对齐要求 进行对齐。

例子:

class A {
    char a;  //1
    int b;   //4
};

内存布局:

a      1
padding 3
b      4
---------
total  8

所以:

sizeof(A) = 8

3 结构体/类整体对齐

类大小必须是 最大成员对齐数的整数倍

例如:

class A {
    char a;   //1
    int b;    //4
    char c;   //1
};

布局:

a      1
pad    3
b      4
c      1
pad    3
---------
total 12

所以:

sizeof(A) = 12

三、空类大小

class A {};

结果:

sizeof(A) = 1

原因:

C++规定:

空类也必须占用至少 1 字节,以保证每个对象有唯一地址。


四、成员函数不占对象大小

class A {
public:
    int a;

    void func() {}
};

对象大小:

sizeof(A) = 4

原因:

函数存在 代码区,不在对象中。


五、静态成员变量不算在类大小里

class A {
public:
    int a;
    static int b;
};

对象大小:

sizeof(A) = 4

原因:

static 成员属于 类,不属于对象


六、虚函数的影响

如果类有 虚函数,会增加 虚函数表指针 (vptr)

例子:

class A {
public:
    int a;
    virtual void func() {}
};

内存:

vptr  8 (64位)
a     4
pad   4
-------
16

结果:

sizeof(A) = 16

(64位系统)


七、完整计算示例

class A {
    char a;   //1
    int b;    //4
    double c; //8
};

计算:

a = 1
padding = 3
b = 4
c = 8
---------
total = 16

因为:

最大对齐 = 8

所以最终:

sizeof(A) = 16

八、总结口诀(面试常问)

计算 C++ 类大小步骤:

1 成员变量大小相加
2 按成员最大对齐补齐
3 类大小必须是最大对齐数的倍数
4 空类 = 1
5 成员函数不算
6 static成员不算
7 虚函数会增加vptr

如果你愿意,我可以再给你讲 C++面试最经典题:计算下面类的大小(100%面试会问),很多人第一次都会算错。

文章已创建 5021

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部