[toc]

# 类的大小计算

类的大小是指类的实例化对象的大小,用 sizeof 对类型名操作时,结果是该类型的对象的大小

计算原则:

  • 遵循结构体的对齐原则
  • 与普通成员变量有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响。因为静态数据成员被类的对象共享,并不属于那个具体的对象。
  • 虚函数对类的大小有影响,是因为虚函数表指针的影响
  • 虚继承对类的大小有影响,是因为虚基表指针带来的影响
  • 空表的大小是一个特殊情况,空类的大小为 1, 当用 new 来创建一个空类的对象时,为了保证不同对象的地址不同,空类也占用存储空间.

# 第一种情况 (无虚函数和虚函数继承)

强调。静态成员变量不会影响类的大小 空类也会占 1 个字节

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
#include<iostream>
using namespace std;

class A{
private:
static int s_var; //不影响类的大小
const int c_var; //4字节
int var; //8字节 4+4(int) = 8
char var1; //12字节8+1(char) + 3 (填充) = 12 内存对齐
public:
A(int temp) :c_var(temp) {} //不影响类的大小
~A(){} //不影响类的大小
};


class B{
};

int main(){
A ex1(4);
B ex2;
cout<<sizeof(ex1) <<endl; //12字节
cout<<sizeof(ex2) <<endl; //1字节

return 0;
}

# 第二种情况 (有虚表的情况)

Tip:

虚函数的个数并不影响所占内存的大小,因为类对象的内存中只保存了指向虚函数表的指针。

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
#include<iostream>
using namespace std;

class A{
private:
static int s_var; //不影响类的大小
const int c_var; //4字节
int var; //8字节 4+4(int) = 8
char var1; //12字节8+1(char) + 3 (填充) = 12
public:
A(int temp) :c_var(temp) {} //不影响类的大小
~A(){} //不影响类的大小
virtual void f(){cout<<"A::f"<<endl;}
virtual void g(){cout<<"A::g"<<endl;}
virtual void h(){cout<<"A::h"<<endl;}
//24字节 12 + 4(填充) + 8 (指向虚函数的指针) = 24
};



int main(){
A ex1(4);
A *p;
cout<<sizeof(p) <<endl; //8字节 指针固定8字节
cout<<sizeof(ex1) <<endl; //24字节
return 0;
}

更新于

请我喝[茶]~( ̄▽ ̄)~*

Solvarg 微信支付

微信支付

Solvarg 支付宝

支付宝

Solvarg 贝宝

贝宝