成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么空類大小是一

開發 前端
本文想分享的空基類優化(EBO)技術。具體其實上面的示例已經很清楚了,就是子類如果繼承空類,并不會產生額外的大小,它的大小還是子類本身的大小。

[[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. }; 

結果如下:

  1. sizeof EmptyA 1 

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

原因如下:

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

實際上,這不是本文的重點,重點其實是想向大家分享一下C++中的空基類優化(EBO)技術。

直接看代碼:

  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. }; 

結果如下:

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

這里:

  • 空類EmptyA的大小是1,上面已經介紹過。
  • 類C的大小是8,因為int占四個字節,EmptyA占1個字節,再加上字節對齊,編譯器補了4個字節,最后就是8。
  • 類A的大小是4,沒啥毛病。
  • 類D的大小是8,因為int占4個字節,繼承的A類也占4個字節,最后就是8。

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

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

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

EBO技術有什么作用?

我們普通開發者可能認為多那一兩個字節沒什么大不了的,但是在STL中,在精益求精、寸土必爭的委員會大佬們那里,這至關重要,再貼下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中各種空類繼承,如果繼承空類會給子類產生額外的大小,那還了得?

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

打完收工。

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2020-06-02 11:25:26

Linux默認頁內存

2012-08-01 14:04:46

Surface

2020-07-29 07:05:00

DevSecOps

2020-09-15 15:53:31

邊緣計算云計算5G

2021-06-02 10:52:01

HTTP3Linux

2023-11-07 08:00:00

Kubernetes

2018-03-22 14:47:13

容器開發人員筆記本

2025-04-10 08:00:00

服務限流開發高并發

2024-01-23 11:31:24

模型AI

2018-01-31 14:50:04

LinuxmacOS .bashrc

2021-10-21 05:30:48

Data Fabric數據管理架構邊緣計算

2024-10-18 11:55:47

2020-03-11 16:20:03

Serializabl接口Java

2020-06-18 07:16:22

聯網車隊物聯網IOT

2021-10-18 05:42:23

代碼編碼開發

2018-01-02 10:14:14

CRM

2022-10-08 06:38:01

元宇宙NFT加密貨幣

2023-03-28 07:26:37

2021-08-26 05:01:40

0x3f 數組算法

2009-08-14 15:42:11

什么是.NET接口.NET抽象類
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 福利片一区二区 | 一区在线视频 | 欧美中文字幕在线 | 欧美成人a∨高清免费观看 欧美日韩中 | 精品一区二区在线观看 | 欧美国产亚洲一区二区 | 欧美色综合一区二区三区 | 国产成人91视频 | 日本三级电影免费观看 | 中国xxxx性xxxx产国 | 奇米四色在线观看 | 国产精品久久网 | 国产精品伦理一区二区三区 | 一区二区三区视频在线观看 | 亚洲精品区 | 日一区二区 | 亚洲精品毛片av | 国产91av视频 | 久久99一区二区 | 欧美一区二区免费电影 | 久久久久亚洲精品 | 久草综合在线 | 欧美激情精品久久久久久免费 | 国产精品久久久久一区二区 | 在线中文字幕亚洲 | 99精品在线 | 久久99精品久久 | 国产精品成人一区二区 | 日本不卡高字幕在线2019 | 精品久久久久久久久久久久久久 | 日本三级网址 | 人人看人人搞 | 久热久热 | 人人九九精 | 999久久久久久久久6666 | 国产三级在线观看播放 | 国产精品日韩高清伦字幕搜索 | 亚洲毛片在线观看 | 国产黄色av网站 | 97操操| 99免费看|