[学习笔记] 各种情况下 class 的大小各是多少?

[复制链接]
1928|1
 楼主| szt1993 发表于 2023-12-23 19:00 | 显示全部楼层 |阅读模式
各种情况下 class 的大小各是多少?
  1. class A {};
  2. int main(){
  3.   cout<<sizeof(A)<<endl;// 输出 1;
  4.   A a;
  5.   cout<<sizeof(a)<<endl;// 输出 1;
  6.   return 0;
  7. }

空类的大小是1, 在C++中空类会占一个字节,这是为了让对象的实例能够相互区别。具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址。当该空白类作为基类时,该类的大小就优化为0了,子类的大小就是子类本身的大小。这就是所谓的空白基类最优化。

空类的实例大小就是类的大小,所以sizeof(a)=1字节,如果a是指针,则sizeof(a)就是指针的大小,即4字节。

  1. class A { virtual void Fun(){} };
  2. int main(){
  3.   cout<<sizeof(A)<<endl;// 输出 4(32位机器)/8(64位机器);
  4.   A a;
  5.   cout<<sizeof(a)<<endl;// 输出 4(32位机器)/8(64位机器);
  6.   return 0;
  7. }

因为有虚函数的类对象中都有一个虚函数表指针 __vptr,其大小是4字节

  1. class A { static int a; };
  2. int main(){
  3.   cout<<sizeof(A)<<endl;// 输出 1;
  4.   A a;
  5.   cout<<sizeof(a)<<endl;// 输出 1;
  6.   return 0;
  7. }

静态成员存放在静态存储区,不占用类的大小, 普通函数也不占用类大小

  1. class A { int a; };
  2. int main(){
  3.   cout<<sizeof(A)<<endl;// 输出 4;
  4.   A a;
  5.   cout<<sizeof(a)<<endl;// 输出 4;
  6.   return 0;
  7. }

  8. class A { static int a; int b; };;
  9. int main(){
  10.   cout<<sizeof(A)<<endl;// 输出 4;
  11.   A a;
  12.   cout<<sizeof(a)<<endl;// 输出 4;
  13.   return 0;
  14. }

静态成员a不占用类的大小,所以类的大小就是b变量的大小 即4个字节

中国龙芯CDX 发表于 2023-12-28 09:20 | 显示全部楼层
计算class 的大小能够快速计算内存空间
您需要登录后才可以回帖 登录 | 注册

本版积分规则

351

主题

3039

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部