博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ | class size
阅读量:6191 次
发布时间:2019-06-21

本文共 2149 字,大约阅读时间需要 7 分钟。

c++类大小和机器还有编译器有关。64位机器指针大小为8个字节,32位机器为4个字节。

  1. 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址;
  2. 有虚函数的类有个virtual table(虚函数表),里面包含了类的所有虚函数,类中有个virtual table pointers,通常成为vptr指向这个virtual table;
  3. 有多个父类的,会维护多个虚函数指针,第一个指向第一个基类的虚函数表(并且带上在类中定义的虚函数),第二个指针指向第二个基类的虚函数表...以此类推。
  4. 虚继承,还有一个指向父类的指针,该指针为指向虚基类的指针(Pointer to virtual base class);
1 #include 
2 3 using namespace std; 4 5 class A {}; 6 7 class B {}; 8 9 class C : public A {10 virtual void func() = 0;11 };12 13 class D : public B, public C {};14 15 class E {16 public:17 virtual void e() {}; 18 private:19 char abc[3];20 };21 22 class F : public E {23 public:24 virtual void f() {};25 };26 27 class G : virtual public E {};28 29 class H {30 public:31 virtual void h() {};32 private:33 char abc[3];34 };35 36 class I : public E, public H {};37 38 class J : virtual public E {};39 40 class K : public G, public J {};41 42 class L {43 static int l;44 static void la() { static int m; }45 };46 47 int main() {48 cout << "sizeof(A) = " << sizeof(A) << endl; // 空类,大小为149 cout << "sizeof(B) = " << sizeof(B) << endl; // 空类,大小为150 cout << "sizeof(C) = " << sizeof(C) << endl; // 虚函数表指针 (64位机器指针为8个字节)51 cout << "sizeof(D) = " << sizeof(D) << endl; // 虚函数表指针52 cout << "sizeof(E) = " << sizeof(E) << endl; // 字节对齐+虚函数表指针(8 + 8)53 cout << "sizeof(F) = " << sizeof(F) << endl; // 同E54 cout << "sizeof(G) = " << sizeof(G) << endl; // 虚继承,还包含一个父类的指针,所以是父类指针 + 虚函数表指针 + 字节对齐 = 2455 cout << "sizeof(H) = " << sizeof(H) << endl; // 同E56 cout << "sizeof(I) = " << sizeof(I) << endl; // 两个虚函数指针分别指向E和H + 两个数组字节对齐 = 3257 cout << "sizeof(J) = " << sizeof(J) << endl; // 同G58 cout << "sizeof(K) = " << sizeof(K) << endl; // 一个指向父类(E)的指针 + 两个虚函数指针分别指向G和J + 一个字节对齐 = 3259 cout << "sizeof(L) = " << sizeof(L) << endl; // 静态变量不占空间60 return 0;61 }

输出:

1 sizeof(A) = 1 2 sizeof(B) = 1 3 sizeof(C) = 8 4 sizeof(D) = 8 5 sizeof(E) = 16 6 sizeof(F) = 16 7 sizeof(G) = 24 8 sizeof(H) = 16 9 sizeof(I) = 3210 sizeof(J) = 2411 sizeof(K) = 3212 sizeof(L) = 1

 

转载于:https://www.cnblogs.com/linyx/p/3897617.html

你可能感兴趣的文章
主机托管与DRaaS的真正区别原来是这样 你猜对了吗?
查看>>
广东省零售连锁协会执行会长:技术更新太快,消费者才是零售企业最大的对手...
查看>>
打造真正理想中的会呼吸的智慧城市
查看>>
打造微信“智慧城市” 乌海率先开通城市公共微信服务
查看>>
Facebook股价周四大涨15.5% 市值超亚马逊
查看>>
物联网时代商业模式将驱动商业策略的转变
查看>>
Windows 10一周年更新版本号将锁定为Build 14393
查看>>
这是一款仅针对「中国网民」的勒索软件(含源码下载)
查看>>
微软宣布与中国电子科技集团筹建合资公司
查看>>
施密特:下个千亿美元市值公司将出在哪个行业
查看>>
青岛市新添智能服务平台 借力大数据智慧城市再扩容
查看>>
《SQL与关系数据库理论——如何编写健壮的SQL代码》一2.9 SQL中的行类型和表类型...
查看>>
如何通过细节来看业务流程ERP管理系统的成熟度?
查看>>
浅谈测试管理—兵者诡道也
查看>>
《高性能Linux服务器构建实战:系统安全、故障排查、自动化运维与集群架构》——3.3 DRBD的管理与维护...
查看>>
提升数据建模的10种技术措施
查看>>
《程序员之禅》一一2.2 佛教中的“小鬼”
查看>>
《计算机系统:系统架构与操作系统的高度集成》——1.5 计算机硬件的演化...
查看>>
《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.19节使用画笔
查看>>
开源分布式关系型数据库 PingCAP 完成 B 轮融资
查看>>