精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入C++核心:空類背后隱藏的內存開銷,你知道嗎?

開發
本文讓我們一起揭開C++空類的神秘面紗,探索這個看似簡單卻暗藏玄機的話題。

你有沒有想過,一個空的購物袋到底有多重????

即使是空的,它也占據著一定的空間,對吧?在C++的世界里,我們也有類似的情況 - 空類(Empty Class)??雌饋硎裁炊紱]有,但它真的一點內存都不占嗎?

讓我們一起揭開C++空類的神秘面紗,探索這個看似簡單卻暗藏玄機的話題。相信我,這個旅程會很有趣!

最簡單的空類

想象一下,你正在收拾房間,把所有東西都清空了。那么問題來了:一個空房間還占地方嗎?

在C++中,我們也有類似的問題:一個空空如也的類會占用內存空間嗎?讓我們一起來探索這個有趣的謎題!

來看看最簡單的空類:

class Empty {};

// 測試一下它的大小
cout << sizeof(Empty) << endl;  // 驚喜:輸出是1!

咦?明明什么都沒有,為什么還要占用1個字節呢?

這就像是你在小區里買房子 - 即使是空房子,也需要有門牌號,對吧!在C++中,每個對象都需要有自己的內存地址(相當于門牌號),所以編譯器會給每個空類安排至少1個字節的空間。

為什么需要這一個字節?

這個1字節的存在有著非常重要的意義!它就像是每個對象的身份證:

Empty e1, e2;   // 創建兩個空類對象

這1字節的主要作用是:

  • 確保每個對象都有唯一的內存地址
  • 使得對象可以被定位和區分
  • 滿足C++標準要求的對象必須具有非零大小的規定

等等,這里可能有個疑問:既然是內存地址,為什么不是8字節(64位系統)或4字節(32位系統)呢???

這里需要區分兩個概念:

  • 對象本身占用的內存大小
  • 指向對象的指針的大小

讓我們用代碼來說明:

Empty e;              // 對象本身占 1 字節
Empty* ptr = &e;      // 指針占 8 字節(在64位系統上)

cout << sizeof(e) << endl;    // 輸出:1
cout << sizeof(ptr) << endl;  // 輸出:8

就像門牌號和GPS坐標的關系:

  • 門牌號(對象本身)只需要很小的空間就能標識這個位置
  • GPS坐標(指針)需要更多的數字來精確定位

編譯器只需要1個字節就能區分不同的對象,而指向這些對象的指針則需要更大的空間來存儲完整的內存地址。這是一個很巧妙的設計!

為什么對象必須有不同的地址呢?這關系到C++的一個基本原則:

Empty* ptr1 = &e1;
Empty* ptr2 = &e2;
assert(ptr1 != ptr2);  // 這個斷言永遠為真,因為每個對象必須有唯一地址

就像在一個小區里,即使是完全相同的兩套房子,也必須有不同的門牌號。這個1字節就相當于對象的"門牌號",讓系統能夠準確找到并區分每一個對象!

虛擬繼承大冒險

嘿!讓我們來玩個有趣的游戲 - 建造屬于我們的動物王國!

首先,我們需要一個動物祖先:

class Animal {};  // ?? 萬物之源!

然后,讓我們召喚一些可愛的小動物:

class Cat : public virtual Animal {};  // ?? 喵星來客
class Dog : public virtual Animal {};  // ?? 汪星使者

咦?這些小可愛的"體重"是多少呢?讓我們偷偷稱一下:

cout << sizeof(Cat) << endl;   // 8字節!??

哇塞!一個空空的貓咪居然有8字節這么重!這是為啥呢?

原來啊,每個虛擬繼承的小動物都帶著一個神奇的指南針:

  • 這個指南針幫它們找到Animal祖先
  • 就像GPS定位器一樣不能丟
  • 在64位系統上,這個指南針要占8個字節呢!

來看個更有意思的 - 動物園時間!

class Zoo {
    Cat kitty;    // ?? 一只優雅的喵
    Dog puppy;    // ?? 一只活潑的汪
};

猜猜動物園有多大?

cout << sizeof(Zoo) << endl;  // 16字節!??

哈!16字節 = 8(喵) + 8(汪) ?? 就像兩個小朋友各自背著自己的小書包!

小提示:

  • 虛擬繼承雖然酷炫,但也要付出代價哦!
  • 如果你的程序想要"減肥",可要慎用這個功能!

看,C++也可以這么可愛對吧?記?。好總€設計都像選擇玩具一樣,要想清楚它的代價哦!

多重繼承的奇妙冒險

哈嘍!今天我們要創造一個超級神奇的生物 - 既是貓又是狗的小可愛!

class CatDog : public Cat, public Dog {};  // 喵星汪星合體! ????

猜猜這個小家伙有多重? 

cout << sizeof(CatDog) << endl;  // 哇塞!8字節耶! ??

為啥是8字節呢?讓我們來解剖一下這個有趣的現象:

(1) 首先,Cat類帶著8字節:

  • 其中包含了指向Animal虛表的指針(在64位系統上是8字節)

(2) Dog類也帶著8字節:

  • 同樣包含指向Animal虛表的指針

(3) 但是這里有個巧妙的地方:

  • Cat和Dog都是虛繼承自Animal
  • 它們共享同一個Animal基類實例
  • 在內存布局中,只需要保存一份Animal的虛表指針
  • 這就是為什么要減去4字節(32位系統)或8字節(64位系統)

(4) 所以最終的計算公式是:

  • 在32位系統:4 + 4 - 4 = 4字節
  • 在64位系統:8 + 8 - 8 = 8字節

就像兩個小朋友(Cat和Dog)共用一本相冊(Animal的信息)一樣,沒必要每人都帶一本相同的!這就是C++編譯器的智慧! 

小彩蛋:有些聰明的編譯器會給它們做個"瘦身" 

  • 通過優化內存對齊和布局
  • 可能會得到更小的實際大小
  • 這種優化被稱為"Empty Base Optimization"(EBO)

記住:不同編譯器就像不同的魔法師,各有各的獨門絕技!但只要理解了原理,你就能成為C++世界的小達人啦! 

更復雜的繼承場景

先來個小提示:還記得虛繼承是做什么的嗎?

// 沒有虛繼承時的菱形繼承問題
class Animal {};
class Bird :public Animal {};
class Fish :public Animal {};
class Flying_Fish :public Bird, public Fish {};  // 兩份Animal!

// 使用虛繼承解決
class Bird :virtualpublic Animal {};  // 只保留一份Animal
class Fish :virtualpublic Animal {};  // 但需要額外的內存開銷

虛繼承就像是給類們安排了一個共享的基類空間,解決了重復繼承的問題。不過這個便利是要付出內存代價的!

讓我們來玩個更刺激的游戲 - 多層繼承大冒險!

先來個基礎款超能力:

class SuperPower {
    virtual void activate() {}  // 激活超能力!?
};

再來個進階版超能力:

class MegaPower : public virtual SuperPower {
    virtual void powerUp() {}  // 能量加倍!??
};

哎呀!這時候事情變得有趣了:

cout << sizeof(SuperPower) << endl;  // 8字節 - 因為虛函數表指針 ??
cout << sizeof(MegaPower) << endl;   // 16字節 - 雙倍的快樂!??

為啥是16字節呢?讓我們拆開看看這個"超能力包裹":

  • 8字節用來存虛函數表指針
  • 8字節用來存虛基類指針
  • 就像雙層漢堡一樣,每層都很重要!

(1) 虛函數表指針(vptr,8字節)

  • 這是一個指向虛函數表(vtable)的指針
  • 虛函數表存儲了所有虛函數的地址
  • 用于實現動態多態,使得程序能在運行時決定調用哪個版本的虛函數
  • 就像一本"說明書",告訴對象:"你的超能力們都藏在哪里"

(2) 虛基類指針(vbptr,8字節)

  • 這個指針指向虛基類表(virtual base table)
  • 用于在運行時定位虛基類的位置
  • 解決菱形繼承問題,確保虛基類只有一個實例
  • 就像一個"導航儀",幫助對象找到它的祖先類

來個形象的比喻:

class MegaPower : public virtual SuperPower {
    virtual void powerUp() {}
};
  • 虛函數表指針就像游戲手柄,控制著不同的技能按鍵(虛函數)
  • 虛基類指針則像是族譜導航,幫助找到共同的祖先(虛基類)

來個更瘋狂的 - 超級英雄時間!

class SuperHero : public virtual MegaPower {
    virtual void fly() {}  // 飛天遁地!??
};

猜猜看這位英雄的"體重"?

cout << sizeof(SuperHero) << endl;  // 16字節 - 咦,沒變重誒!??

為什么沒變重?因為:

  • 虛繼承只需要一個虛表指針
  • 所有的虛函數共享同一個虛表
  • 這就是C++的魔法!

小貼士:記住這個公式

  • 普通類 + 虛函數 = 8字節(64位系統)
  • 加上虛繼承 = 16字節
  • 再多繼承也不會更重啦!(除非加了新成員)

就像疊疊樂游戲,有技巧才不會倒!

優化技巧與注意事項 

來看看如何給我們的類"減肥"吧! 

(1) 巧用空基類優化 (EBO) 

// 不好的寫法 - 浪費內存
class MyClass {
    EmptyBase base;  // 占1字節
    int data;        // 占4字節,但可能因對齊變成8字節
};

// 聰明的寫法 - 節省空間
class MyClass : private EmptyBase {
    int data;  // 只占4字節,EmptyBase不占額外空間
};

這就像是把空書包直接背在身上,而不是放在行李箱里! ??

(2) 合理使用虛繼承

// 需要虛繼承時才用它
class Bird : virtual public Animal {};  // ??

// 普通情況用普通繼承就好
class Cat : public Animal {};  // ?? 省內存!

(3) 對齊小魔法

class SmartClass {
    char flag;     // 1字節
    int data;      // 4字節
    char status;   // 1字節
};  // 實際占12字節,因為對齊!

// 優化后:
class SmartClass {
    int data;      // 4字節
    char flag;     // 1字節
    char status;   // 1字節
};  // 現在只占8字節啦! 

把小件物品巧妙放置,就像俄羅斯方塊一樣! 

總結要點

讓我們來個歡樂總結吧! 

(1) 空類的秘密

  • 空類占1字節 - 就像空房子也要有門牌號! 
  • 指針永遠是固定大小(32位4字節/64位8字節) 

(2) 繼承的趣事

class Empty {};           // 1字節
class Virtual {          // 8字節
    virtual void foo();  // 因為虛函數表指針
};

(3) 內存對齊小貼士

  • 就像疊積木,要整整齊齊! 
  • 合理布局可以省下不少空間 

(4) 實用建議

  • 不需要虛函數就別用 
  • 善用EBO來節省空間 
  • 把相同大小的成員放一起 

記?。簝灮苤匾?但代碼可讀性更重要! 平衡最美! 

這就是C++的空類世界啦! 雖然看起來空空的,但學問可不少呢! ??

責任編輯:趙寧寧 來源: everystep
相關推薦

2022-10-11 08:14:14

多線程鎖機制

2023-12-12 08:41:01

2025-01-26 16:01:13

C++靜態成員函數

2021-09-13 19:28:42

JavaNetty開發

2024-09-12 08:20:39

2022-02-25 08:13:03

物聯網IOT

2022-09-29 15:32:58

云計算計算模式

2021-10-14 06:52:47

算法校驗碼結構

2024-09-18 07:00:00

消息隊列中間件消息隊列

2022-03-10 08:25:27

JavaScrip變量作用域

2019-12-12 09:23:29

Hello World操作系統函數庫

2021-09-19 22:51:49

iPhone手機iOS

2024-04-07 00:00:00

ESlint命令變量

2024-05-28 09:12:10

2023-04-26 10:21:04

2023-12-20 08:23:53

NIO組件非阻塞

2024-04-30 09:02:48

2024-11-01 10:48:01

C#WPF程序

2017-10-13 11:13:16

微信隱藏功能視頻編輯

2020-05-15 14:34:16

C語言丹尼斯 · 里奇開發者
點贊
收藏

51CTO技術棧公眾號

国产精品久久激情| 亚洲国产精品系列| 亚洲国产精品女人| 亚洲黄色在线免费观看| 国产日产高清欧美一区二区三区| 亚洲男人第一网站| www.99r| 免费av不卡在线观看| 91欧美一区二区| 国产精品网红福利| 国产在线综合网| 国产一区二区在线| 日韩午夜激情电影| 欧美伦理视频在线观看| 亚洲制服国产| 久久精品人人做人人爽97| 亚洲sss综合天堂久久| 五月天综合激情网| 永久91嫩草亚洲精品人人| 国产视频精品一区二区三区| 亚洲综合20p| 久久人体大尺度| 亚洲资源在线观看| 亚洲无玛一区| 偷拍自拍在线视频| 国产91精品一区二区麻豆亚洲| 国产精品999| 日本三级黄色大片| 亚洲国产不卡| 少妇激情综合网| 老司机福利av| 欧美福利在线播放网址导航| 欧美一区二区三区思思人| 日本熟妇人妻xxxxx| 第一中文字幕在线| 日韩一区欧美小说| 日韩欧美精品一区二区三区经典| 人妻无码中文字幕免费视频蜜桃| 久久精品二区亚洲w码| 国产成人精品在线播放| www.日本精品| 亚洲乱亚洲高清| 欧美黑人xxxⅹ高潮交| av最新在线观看| 日韩久久精品网| 亚洲视频在线观看免费| 99久久久久久久久久| 天天操综合520| 亚洲а∨天堂久久精品喷水| 极品人妻一区二区| 99视频这里有精品| 9191久久久久久久久久久| 乌克兰美女av| 狠狠久久伊人中文字幕| 欧美日韩一区二区不卡| 天天操天天爱天天爽| 亚洲综合在线电影| 在线一区二区观看| 手机在线免费观看毛片| 91福利精品在线观看| 在线观看日韩精品| a在线观看免费视频| 国产亚洲精品精品国产亚洲综合| 欧美日韩一卡二卡| 男人午夜视频在线观看| 欧美一区一区| 亚洲精品在线观看视频| 天堂久久久久久| 久久不见久久见免费视频7| 亚洲午夜av久久乱码| 精品无码国产污污污免费网站 | 国产草草浮力影院| 加勒比色老久久爱综合网| 亚洲精品按摩视频| 精品人妻少妇嫩草av无码| 久久人人妻人人人人妻性色av| 九九久久国产| 欧美高清性hdvideosex| wwww.国产| 欧美黑粗硬大| 一本到高清视频免费精品| 激情六月丁香婷婷| 四虎4545www精品视频| 欧洲视频一区二区| 国产美女18xxxx免费视频| 四虎精品一区二区免费| 欧美一级片免费看| 久久aaaa片一区二区| 51亚洲精品| 亚洲黄色在线看| 波多野结衣一本| 国产亚洲一卡2卡3卡4卡新区| 国产一区二区三区四区福利| 精品手机在线视频| 欧美va天堂在线| 欧美成人午夜剧场免费观看| 韩国av中文字幕| 日韩va亚洲va欧美va久久| 成人乱人伦精品视频在线观看| 国产激情久久久久久熟女老人av| 99久久精品免费看国产| 日本午夜精品电影| 国产美女av在线| 黄网动漫久久久| 国产福利一区视频| 123成人网| 亚洲国产欧美一区二区丝袜黑人| 亚洲精品国产一区黑色丝袜| 91精品啪在线观看国产18| 久久久亚洲国产| 天天综合久久综合| 国产99精品视频| 欧美日韩在线精品| 四季久久免费一区二区三区四区| 黄色成人av在线| 中文字幕第36页| 免费萌白酱国产一区二区三区| 在线看片第一页欧美| 激情五月少妇a| 日本中文字幕一区二区有限公司| 成人av资源网| 第一页在线观看| 亚洲国产精品一区二区尤物区| 欧美伦理视频在线观看| 97人人澡人人爽91综合色| 国产亚洲精品高潮| 精品少妇一二三区| 另类调教123区| 爱情岛论坛亚洲入口| 老司机精品视频在线观看6| 欧美日韩视频免费播放| 1314成人网| 国产精品美女久久久久久不卡| 欧美福利在线观看| 国产九色91回来了| 99久久精品99国产精品| 欧美日韩午夜爽爽| 国产精品原创视频| 日韩精品在线私人| 久久99精品波多结衣一区| 国产美女主播视频一区| 亚洲电影免费| 日韩精品专区| 日韩成人av网| 日本三级网站在线观看| 国产一区二区三区免费观看| 五月六月丁香婷婷| 欧美v亚洲v| 精品视频免费在线| 91玉足脚交白嫩脚丫| 欧美成人嫩草网站| 日韩av不卡电影| 深夜福利免费在线观看| 亚洲不卡在线观看| 中国男女全黄大片| 天天av综合| 国产69精品久久久久久| 天天av综合网| 午夜精品视频一区| 色诱av手机版| 欧美日韩a区| 亚洲xxx大片| 色呦呦在线视频| 欧美草草影院在线视频| www.4hu95.com四虎| 亚洲专区一区| 久久五月天婷婷| 英国三级经典在线观看| 精品视频—区二区三区免费| 国产精品第72页| gogo大胆日本视频一区| 欧美 丝袜 自拍 制服 另类 | 青草青草久热精品视频在线观看| 天天爱天天干天天操| 五月天欧美精品| 国产精品1000部啪视频| 久久久777| 日韩av图片| 韩国理伦片久久电影网| 久久伊人精品天天| 国产福利视频导航| 亚洲精品成人在线| 精品夜夜澡人妻无码av| 日韩制服丝袜先锋影音| 亚洲欧美日韩精品在线| 国产一区二区三区国产精品| 日韩日本欧美亚洲| 成人av一区二区三区在线观看| 一区二区三区欧美视频| 极品白嫩的小少妇| 国产深夜精品| 亚洲免费视频一区| 亚洲精品v亚洲精品v日韩精品| 九九热视频这里只有精品| 亚洲欧洲成人在线| 日本韩国欧美在线| 国产美女福利视频| 成人国产免费视频| 亚洲精品高清无码视频| 自由日本语亚洲人高潮| 精品综合在线| 欧美电影免费观看高清完整| 美日韩在线视频| 欧美人体大胆444www| 国产毛片毛片毛片毛片| 四虎成人精品永久免费av九九| 国产精品久久视频| 国产成人在线视频免费观看| 精品国产精品网麻豆系列| 国产99久久久| 国产精品久久久久久久蜜臀| 久久久久国产免费| 久久美女性网| 97在线免费视频观看| 制服丝袜日韩| 亚洲自拍偷拍网址| 91在线三级| 久久精品在线视频| 性感美女视频一二三| 欧美日韩视频一区二区| 国产精品视频自拍| 日韩私人影院| 91精品国产欧美一区二区成人| 国产精品成人aaaa在线| 中文字幕亚洲在| 中文字幕三级电影| 蜜桃久久久久久| 9久久9毛片又大又硬又粗| 我不卡影院28| 欧美视频观看一区| 51精品国产| 国产精品色午夜在线观看| 欧美办公室脚交xxxx| 蜜臀久久99精品久久久无需会员| 蜜桃视频在线免费| 精品日产卡一卡二卡麻豆| 真实新婚偷拍xxxxx| 激情av一区二区| 老湿机69福利| 国产欧美日韩亚州综合 | 精品视频色一区| 男人天堂av在线播放| 午夜精品一区二区三区三上悠亚| 波多野结衣在线网址| 国产日韩v精品一区二区| 亚洲av无码一区二区三区网址 | 日本r级电影在线观看| 日日噜噜噜夜夜爽亚洲精品 | 欧美熟妇交换久久久久久分类| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 91九色丨porny丨肉丝| 一片黄亚洲嫩模| 婷婷激情四射网| 亚洲国产高清在线| 中文字幕被公侵犯的漂亮人妻| 99久免费精品视频在线观看| 日本人妻一区二区三区| 国产自产v一区二区三区c| 午夜久久福利视频| 蜜桃久久av一区| 亚洲欧美国产日韩综合| 日本va欧美va欧美va精品| 免费激情视频在线观看| 国产欧美日韩一级| 一本久道综合色婷婷五月| 久久成人一区| 色综合av综合无码综合网站| 久久成人国产| 在线视频日韩一区| 美女脱光内衣内裤视频久久影院| 黑森林福利视频导航| 蜜臀精品久久久久久蜜臀| 在线观看免费不卡av| 国产一区二区三区四区五区美女 | 欧美日韩中字一区| 一区二区三区日| 91精品国产品国语在线不卡| 亚洲va欧美va| 日韩一区二区不卡| 日本视频在线观看一区二区三区| 亚洲精品有码在线| 成人免费视频| 亚洲小视频在线| 日本在线观看www| 高清欧美性猛交xxxx黑人猛交| 国产夫妻在线| 国产精品www网站| 亚洲ww精品| 国产日韩久久| 韩日一区二区三区| 999久久欧美人妻一区二区| 一本久道久久综合狠狠爱| 免费裸体美女网站| 狠狠v欧美v日韩v亚洲ⅴ| 2025中文字幕| 久久亚洲免费视频| 色婷婷国产精品免| 亚洲国产精品一区二区www在线 | 色悠悠久久综合| 亚洲综合五月天婷婷丁香| 日韩欧美亚洲一区二区| 熟妇人妻一区二区三区四区| 亚洲视频在线免费看| 欧美日韩在线看片| 国模极品一区二区三区| 巨胸喷奶水www久久久免费动漫| 5g国产欧美日韩视频| 中文有码一区| 欧洲金发美女大战黑人| 亚洲啪啪91| 色哟哟免费视频| 久久久一区二区三区捆绑**| 日本黄色片免费观看| 欧美性xxxxx极品| 国产精品高潮呻吟av| 亚洲精品久久久久国产| av在线电影院| 97超级碰在线看视频免费在线看| 高清在线一区| 精品国产综合| 91精品二区| 国产精品视频黄色| 91免费看片在线观看| 国产女人18水真多毛片18精品| 色综合久久久久久久久| 亚洲精品国产精品国| 在线国产精品视频| 精品极品在线| 亚洲sss综合天堂久久| 国产精品99一区二区三| av动漫在线观看| 福利视频网站一区二区三区| 91麻豆精品久久毛片一级| 欧美日韩中文字幕| 99久久精品日本一区二区免费| 日韩在线观看免费全集电视剧网站 | 福利一区在线观看| 第一次破处视频| 91搞黄在线观看| 五月天婷婷在线播放| 日韩在线观看免费全集电视剧网站| 日本不卡免费高清视频在线| 999在线观看免费大全电视剧| 日韩免费特黄一二三区| 69堂免费视频| 26uuu亚洲综合色| 日本特黄特色aaa大片免费| 日韩片之四级片| 成年人黄视频在线观看| 成人精品一区二区三区| 精品国产精品久久一区免费式| 男女高潮又爽又黄又无遮挡| 丰满放荡岳乱妇91ww| 天天看片中文字幕| 欧美一区二区三区免费在线看| 午夜视频在线免费观看| 成人黄色激情网| 天天操综合网| aaa一级黄色片| 亚洲精品日日夜夜| 精品久久久免费视频| 久久国产精品久久久久久| 7m精品国产导航在线| 欧美一区二区激情| 成人丝袜高跟foot| 国产性xxxx高清| 日韩精品中文字| 高清欧美日韩| 最近免费观看高清韩国日本大全| 狠狠久久亚洲欧美| 国产成人无码aa精品一区| 欧美mv和日韩mv国产网站| a毛片在线看免费观看| 欧美性猛交xxxxx免费看| 国产美女精品久久| 欧美性色xo影院| 福利视频在线导航| 国产视频福利一区| 欧美日韩1区2区3区| 800av在线播放| 日本高清成人免费播放| av影片免费在线观看| 91久久久久久久久| 亚洲午夜在线| 日本黄色网址大全| 欧美日韩国产精选| 51xtv成人影院| 国产欧美一区二区在线播放| 久久精品官网| 69夜色精品国产69乱| 欧美成人精品1314www| 欧美影视资讯| japanese在线播放| 91麻豆精品一区二区三区| 伊人网免费视频| 丝袜情趣国产精品| 欧美巨大xxxx| 加勒比av中文字幕| 亚洲一区二区三区视频在线播放 | 久久99精品久久久久久国产越南 |