成人免费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

2025-04-10 08:00:00

服務限流開發高并發

2018-03-22 14:47:13

容器開發人員筆記本

2024-01-23 11:31:24

模型AI

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數據管理架構邊緣計算

2009-08-14 15:42:11

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

2020-06-18 07:16:22

聯網車隊物聯網IOT

2022-10-08 06:38:01

元宇宙NFT加密貨幣

2018-01-02 10:14:14

CRM

2021-10-18 05:42:23

代碼編碼開發

2023-12-06 12:11:43

類加載器雙親委派模型

2023-03-28 07:26:37

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩综合视频 | 日韩区 | 国际精品鲁一鲁一区二区小说 | 国产在线精品一区二区三区 | 青青草中文字幕 | 99re在线视频观看 | 亚洲精品一区二区网址 | 国产一区二区三区久久久久久久久 | 伊人精品视频 | 亚洲高清视频在线观看 | 久久久久久网站 | 久久国产成人 | 日本成人在线观看网站 | 久草热在线 | 国产 欧美 日韩 一区 | 1204国产成人精品视频 | 欧美在线视频免费 | 夜夜草 | 欧美激情国产精品 | 一区二区国产精品 | 断背山在线观看 | 中文字幕一区二区三区精彩视频 | 久草在线 | 丁香婷婷综合激情五月色 | 欧美中文字幕一区二区三区 | 欧美一区两区 | 四虎影 | 亚洲一区二区视频 | 天天躁日日躁xxxxaaaa | 欧美日韩在线视频一区 | 日韩欧美亚洲一区 | 日日碰狠狠躁久久躁96avv | 久草视频在线播放 | 91久久久久 | 国产美女在线免费观看 | 欧美精品一二区 | 国产一区二区三区免费 | 91在线导航| 国产精品久久久亚洲 | 99reav| 午夜精品一区二区三区在线视频 |