自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么空類大小是一

開發(fā) 前端
本文想分享的空基類優(yōu)化(EBO)技術(shù)。具體其實(shí)上面的示例已經(jīng)很清楚了,就是子類如果繼承空類,并不會產(chǎn)生額外的大小,它的大小還是子類本身的大小。

[[435414]]

我們可能都知道,C++中空類的大小是1。

  1. #include <iostream> 
  2.  
  3. class EmptyA {}; 
  4.  
  5. int main() { 
  6.     std::cout << "sizeof EmptyA " << sizeof(EmptyA) << std::endl; 
  7.     return 0; 
  8. }; 

結(jié)果如下:

  1. sizeof EmptyA 1 

然而在C語言中空結(jié)構(gòu)體的大小是0,空結(jié)構(gòu)體大小是0我們貌似可以理解,但為什么到C++中,空類的大小卻是1呢?

原因如下:

實(shí)際上,這是類結(jié)構(gòu)體實(shí)例化的原因,空的類或結(jié)構(gòu)體同樣可以被實(shí)例化,如果定義對空的類或者結(jié)構(gòu)體取sizeof()的值為0,那么該空的類或結(jié)構(gòu)體實(shí)例化出很多實(shí)例時(shí),在內(nèi)存地址上就不能區(qū)分該類實(shí)例化出的實(shí)例,所以,為了實(shí)現(xiàn)每個(gè)實(shí)例在內(nèi)存中都有一個(gè)獨(dú)一無二的地址,編譯器往往會給一個(gè)空類隱含的加一個(gè)字節(jié),這樣空類在實(shí)例化后在內(nèi)存得到了獨(dú)一無二的地址,所以空類所占的內(nèi)存大小是1個(gè)字節(jié)。

實(shí)際上,這不是本文的重點(diǎn),重點(diǎn)其實(shí)是想向大家分享一下C++中的空基類優(yōu)化(EBO)技術(shù)。

直接看代碼:

  1. #include <iostream> 
  2.  
  3. class EmptyA {}; 
  4.  
  5. class A { 
  6.     int a; 
  7. }; 
  8.  
  9. class B : public EmptyA { 
  10.     int b; 
  11. }; 
  12.  
  13. class D : public A { 
  14.     int d; 
  15. }; 
  16.  
  17. class C { 
  18.     int c; 
  19.     EmptyA d; 
  20. }; 
  21.  
  22. int main() { 
  23.     std::cout << "sizeof EmptyA " << sizeof(EmptyA) << std::endl; 
  24.     std::cout << "sizeof B " << sizeof(B) << std::endl; 
  25.     std::cout << "sizeof C " << sizeof(C) << std::endl; 
  26.     std::cout << "sizeof A " << sizeof(A) << std::endl; 
  27.     std::cout << "sizeof D " << sizeof(D) << std::endl; 
  28.     return 0; 
  29. }; 

結(jié)果如下:

  1. sizeof EmptyA 1 
  2. sizeof B 4 
  3. sizeof C 8 
  4. sizeof A 4 
  5. sizeof D 8 

這里:

  • 空類EmptyA的大小是1,上面已經(jīng)介紹過。
  • 類C的大小是8,因?yàn)閕nt占四個(gè)字節(jié),EmptyA占1個(gè)字節(jié),再加上字節(jié)對齊,編譯器補(bǔ)了4個(gè)字節(jié),最后就是8。
  • 類A的大小是4,沒啥毛病。
  • 類D的大小是8,因?yàn)閕nt占4個(gè)字節(jié),繼承的A類也占4個(gè)字節(jié),最后就是8。

可以看到,類B的大小是4。

為什么同樣是繼承。類D把類A的大小繼承了下來。而類B的大小卻是4,為什么沒有把EmptyA的大小繼承下來呢?

這就是本文想分享的空基類優(yōu)化(EBO)技術(shù)。具體其實(shí)上面的示例已經(jīng)很清楚了,就是子類如果繼承空類,并不會產(chǎn)生額外的大小,它的大小還是子類本身的大小。

EBO技術(shù)有什么作用?

我們普通開發(fā)者可能認(rèn)為多那一兩個(gè)字節(jié)沒什么大不了的,但是在STL中,在精益求精、寸土必爭的委員會大佬們那里,這至關(guān)重要,再貼下EBO在STL中的作用。

  1. template<typename _Tp, _Tp __v> 
  2. struct integral_constant { 
  3.     static constexpr _Tp                  value = __v; 
  4.     typedef _Tp                           value_type; 
  5.     typedef integral_constant<_Tp, __v>   type; 
  6. }; 
  7.  
  8. typedef integral_constant<bool, true>     true_type; 
  9.  
  10. typedef integral_constant<bool, false>    false_type; 
  11.  
  12. template<> 
  13. struct __is_floating_point_helper<float
  14. public true_type { }; 
  15.  
  16. template<> 
  17. struct __is_floating_point_helper<double
  18. public true_type { }; 

STL中各種空類繼承,如果繼承空類會給子類產(chǎn)生額外的大小,那還了得?

我們可能平時(shí)用不到EBO技術(shù),但還是建議了解,說不上哪天可以和面試官裝一波呢。

打完收工。

 

責(zé)任編輯:武曉燕 來源: 程序喵大人
相關(guān)推薦

2020-06-02 11:25:26

Linux默認(rèn)頁內(nèi)存

2012-08-01 14:04:46

Surface

2020-07-29 07:05:00

DevSecOps

2020-03-11 16:20:03

Serializabl接口Java

2018-01-31 14:50:04

LinuxmacOS .bashrc

2024-10-18 11:55:47

2021-10-21 05:30:48

Data Fabric數(shù)據(jù)管理架構(gòu)邊緣計(jì)算

2025-04-10 08:00:00

服務(wù)限流開發(fā)高并發(fā)

2023-11-07 08:00:00

Kubernetes

2020-09-15 15:53:31

邊緣計(jì)算云計(jì)算5G

2021-06-02 10:52:01

HTTP3Linux

2024-01-23 11:31:24

模型AI

2018-03-22 14:47:13

容器開發(fā)人員筆記本

2023-12-06 12:11:43

類加載器雙親委派模型

2009-08-14 15:42:11

什么是.NET接口.NET抽象類

2022-10-08 06:38:01

元宇宙NFT加密貨幣

2021-10-18 05:42:23

代碼編碼開發(fā)

2018-01-02 10:14:14

CRM

2020-06-18 07:16:22

聯(lián)網(wǎng)車隊(duì)物聯(lián)網(wǎng)IOT

2023-03-28 07:26:37

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號