精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日本女人一区二区三区| 影视先锋久久| 91免费看`日韩一区二区| 综合国产在线观看| 日韩中文字幕三区| 亚洲熟妇av乱码在线观看| 成人在线视频你懂的| 亚洲视频在线一区| 91精品久久久久久久久中文字幕| 久久国产在线观看| 99tv成人影院| 最近日韩中文字幕| 成人黄色在线免费| 日本黄色片免费观看| 国产一区二区三区四区五区3d | yy1111111| 在线观看男女av免费网址| 国产99久久久国产精品潘金| 国产成人激情视频| 久久久久久久毛片| 精品国产欧美日韩一区二区三区| 国产日韩欧美精品电影三级在线| 欧美在线日韩在线| 超碰97人人干| 向日葵视频成人app网址| 久久影院电视剧免费观看| 97久久国产精品| 蜜桃av免费看| 成人午夜毛片| 亚洲日本va在线观看| www.久久艹| 久久久精品99| 天堂网av成人| 欧美日韩视频在线第一区| 成年人黄色在线观看| 免费资源在线观看| 久久国产乱子精品免费女| 日韩亚洲欧美中文在线| 国产成人精品综合久久久久99 | 欧美私人网站| 国产精品亚洲午夜一区二区三区| 国产成人精品一区二区三区| 91香蕉视频污在线观看| 天美av一区二区三区久久| 欧美亚州韩日在线看免费版国语版| 视频一区二区精品| 99久久久国产精品无码网爆 | 久久精品亚洲天堂| 国产理论电影在线| av中文字幕亚洲| 国产精品69av| 精品国产乱码久久久久久鸭王1| 97青娱国产盛宴精品视频| 欧美视频在线一区二区三区 | 激情综合网天天干| 久久亚洲精品成人| 黄色片子免费看| 四虎精品一区二区免费| 亚洲一区二三区| 欧美日韩一区综合| www.日日夜夜| 老司机亚洲精品| 欧美大胆a视频| 18禁裸乳无遮挡啪啪无码免费| 国外成人福利视频| 亚洲电影中文字幕在线观看| www.亚洲成人网| 成人日批视频| 久久久亚洲高清| 147欧美人体大胆444| 欧美bbbbbbbbbbbb精品| 日韩精品一区二区三区免费观影| 日韩一二在线观看| 午夜欧美福利视频| 国产黄色大片在线观看| 国产喷白浆一区二区三区| 丁香婷婷久久久综合精品国产| 日本视频免费观看| 欧美 日韩 国产一区二区在线视频| 亚洲精品97久久| 国产艳俗歌舞表演hd| 久9久9色综合| 亚洲国模精品一区| 性生活一级大片| 深夜视频一区二区| 欧美精品1区2区3区| 欧美 日韩 国产 激情| www红色一片_亚洲成a人片在线观看_| 久久久精品免费免费| 99在线视频首页| 国产美女免费视频| 蜜臀a∨国产成人精品| 91精品国产综合久久香蕉最新版| 亚洲欧美综合另类| 国产在线欧美| 精品中文字幕在线观看| 刘亦菲国产毛片bd| 欧美涩涩视频| 欧美精品在线观看| 日韩激情小视频| 国产韩日影视精品| 国精产品一区一区三区有限在线| 1024手机在线视频| 久久久久久久久久久9不雅视频| 欧美黄色片免费观看| 亚洲av鲁丝一区二区三区| 国产精品久久观看| 日韩中文字幕在线播放| 欧美一级高潮片| 蜜臀av性久久久久蜜臀av麻豆| 国产aⅴ夜夜欢一区二区三区| 日本亚洲欧美在线| 精品成人在线| 国内精品小视频在线观看| 国产小视频在线看| 国产一区美女| 高清欧美一区二区三区| 日韩大片免费在线观看| 亚洲国产国产亚洲一二三| 国产精品久久久久久久久免费看 | japanese在线视频| 国产精品刘玥久久一区| √…a在线天堂一区| 中文视频一区视频二区视频三区| 91在线直播| 中文字幕视频一区二区三区久| 亚洲欧洲一区二区在线观看| 91在线品视觉盛宴免费| 综合久久久久久久| 成年人深夜视频| 国产精选在线| 在线视频你懂得一区| 9久久婷婷国产综合精品性色 | 精品成人久久久| 欧美亚洲一级| 国产精品嫩草影院久久久| 国产精品污视频| 东方欧美亚洲色图在线| 久久大片网站| 午夜毛片在线| 亚洲制服丝袜一区| 国产原创中文在线观看 | 国产在线一区二区三区欧美| 无码精品在线观看| 国产亚洲一二三区| 熟妇熟女乱妇乱女网站| free性欧美16hd| 色视频成人在线观看免| 久久99999| 国内精品久久久久久久久电影网 | 中文字幕网址在线| 国产一区二区福利| 精品国产乱码久久久久久88av| 欧美女子与性| 亚洲黄色小视频| 香蕉视频xxx| 尤物tv在线精品| 久99久在线视频| 亚洲欧美一区二区三区在线观看| 久久国产尿小便嘘嘘| 国产精品日韩欧美一区二区三区| 91福利国产在线观看菠萝蜜| 日韩欧美国产一区二区| 亚洲在线观看网站| 综合天堂av久久久久久久| 国产成人+综合亚洲+天堂| 国产精品爽爽久久| 国产性色一区二区| 老司机激情视频| 亚洲国产尤物| 日韩成人av在线| 少妇被躁爽到高潮无码文| 日韩和欧美的一区| 国产精品免费在线播放| 黄黄的网站在线观看| 欧美性xxxxxxx| 欧美一级大片免费看| 成人免费av| 91av视频在线观看| 亚洲av无码国产综合专区| 亚洲综合精品久久| 亚欧激情乱码久久久久久久久| 露出调教综合另类| 欧美成人高清视频| 黄色一级a毛片| 色狠狠一区二区三区香蕉| 欧美一级片在线免费观看| 亚洲图片在线| 91福利入口| 秋霞午夜理伦电影在线观看| 色婷婷综合久色| 男男做爰猛烈叫床爽爽小说| 欧美久久久久| 91理论片午午论夜理片久久| av在线天堂播放| 日本乱人伦aⅴ精品| 亚洲熟女乱综合一区二区三区 | 国产精品自在自线| 国产一区日韩欧美| 国产区日韩欧美| 欧美aaa免费| 精品国产一区二区亚洲人成毛片| 天海翼在线视频| 成人av在线网| 麻豆tv在线播放| 日韩精品2区| 国产精品爽爽爽| av影片在线| 亚洲国产精品va在线观看黑人| 欧美性猛交xxxx乱大交hd| 久久久久久亚洲综合| 女人另类性混交zo| 欧美精品系列| 国产精品三级美女白浆呻吟| 可以在线观看的黄色| 一本色道a无线码一区v| 公侵犯人妻一区二区三区| 麻豆九一精品爱看视频在线观看免费| 久久久精品动漫| 精品久久亚洲| 欧美日韩aaaa| 手机av免费在线观看| 亚洲高清免费观看| 一本加勒比波多野结衣| 亚洲欧美视频一区二区三区| 欧美日韩国产综合视频在线| 成人在线黄色| 精品国产一区二区三区久久狼黑人 | 国产精品极品在线观看| 欧美国产中文字幕| 日本毛片在线观看| 一本久久a久久免费精品不卡| 日韩免费高清一区二区| 乱码第一页成人| 成年人免费观看的视频| 欧美中文高清| 欧美性视频精品| 阿v免费在线观看| 91麻豆精品国产自产在线观看一区| 免费在线黄色网| 成人美女在线观看| 50路60路老熟妇啪啪| 亚洲mv大片欧洲mv大片| 国产精品一区二区三区观看| 精品国产亚洲一区二区三区| 成人福利网站在线观看11| 视频在线这里都是精品| 国产视频综合在线| 午夜18视频在线观看| 精品视频一区 二区 三区| 北条麻妃在线观看视频| 成人免费视频一区| 亚洲欧美综合视频| 日本欧美在线观看| 国产女主播av| 国产欧美日韩| 欧美日韩国产综合视频在线| 日韩中文字幕| 91影院未满十八岁禁止入内| 欧美不卡高清一区二区三区| 欧亚精品在线观看| 在线中文字幕电影| 亚洲人成免费电影| 午夜精品久久久久久久99热黄桃| 色成人在线视频| 波多野结衣在线电影| 亚洲一区二区在线免费观看视频| 婷婷色一区二区三区| 国产精品18久久久久久vr| 999精品网站| 最新亚洲视频| 男人的天堂成人| 精品国产91| 伊人久久99| 成人婷婷网色偷偷亚洲男人的天堂| 国产精品国产精品国产专区不卡| 国产成人精品一区二三区在线观看 | 日本韩国欧美三级| 久久久久香蕉视频| 一色屋精品亚洲香蕉网站| 欧美特级黄色录像| 久久久久久97三级| 国产福利视频网站| 国产精品你懂的| 黑鬼狂亚洲人videos| 亚洲国产综合在线| 中文字幕亚洲欧美日韩| 国产精品久久久久一区| 国产一区二区视频在线观看免费| 国产精品美女一区二区三区 | 激情小视频在线| 亚洲精品一区在线观看| 性欧美激情精品| 国产精品一区二区av白丝下载| 色中色一区二区| 51国产偷自视频区视频| 亚洲综合av网| 久久艹精品视频| 一区二区三区在线免费视频 | 日韩欧美国产成人| 国产毛片aaa| 欧美剧情电影在线观看完整版免费励志电影| 天天爽天天爽天天爽| 国产欧美日韩在线| 草视频在线观看| 色哟哟精品一区| 国偷自拍第113页| 欧美日韩一区二区三区高清| 亚洲精品中文字幕成人片| 91精品久久久久久蜜臀| 乱精品一区字幕二区| 欧美成va人片在线观看| 亚洲精品一区二区三区新线路 | 91免费版黄色| 日本高清精品| 成人欧美一区二区三区视频xxx| 欧美国产中文高清| 亚洲专区国产精品| 911亚洲精品| 精品国产区在线| 美女毛片一区二区三区四区| 日本不卡一区二区三区在线观看 | 精品少妇人妻av免费久久洗澡| 亚洲免费精品| 爱福利视频一区二区| 日韩国产欧美在线视频| 久草免费资源站| 成人午夜伦理影院| 亚洲黄色在线网站| 国产欧美一区二区在线观看| 久久精品亚洲无码| 欧美视频一二三| 欧美自拍偷拍一区二区| 亚洲精品日韩在线| 黄网站在线观| 欧美一区二三区| av动漫精品一区二区| 麻豆精品蜜桃一区二区三区| 国产精品一线天粉嫩av| 影音先锋欧美在线| 福利精品在线| 在线看日本不卡| 97人妻精品一区二区三区视频| 亚洲另类图片色| 黄视频免费在线看| 国产精品久久999| 蜜桃精品视频| 欧美日韩精品久久久免费观看| 亚洲国产导航| 天美星空大象mv在线观看视频| 国产成人综合在线观看| 亚洲av综合一区二区| 亚洲欧美日韩精品久久久久| 99热国产在线观看| 欧美久久久久久久久中文字幕| av电影在线播放高清免费观看| 色综合导航网站| 99久久精品一区二区成人| 日本一区二区三区免费观看| 青青草一区二区三区| 91丨porny丨九色| 国产亚洲污的网站| 久久久久久久久久91| 91久久精品一区二区三区| 99久久国产热无码精品免费| 亚洲精品自拍偷拍| 色帝国亚洲欧美在线| 国产精品福利在线观看| 国产成人精品亚洲线观看| 亚洲欧美日韩不卡一区二区三区| 欧美日韩免费观看一区=区三区| 久久精品视频91| 成人午夜碰碰视频| av成人免费网站| 欧美在线视频日韩| 日本成人在线播放| 国产成人精品国内自产拍免费看| 6080亚洲理论片在线观看| 伊人久久大香线蕉精品| 日日夜夜一区二区| 欧美在线一级片| 中文字幕一区二区三| 波多野结衣一二区| 久久精品国产一区二区电影| 韩国精品主播一区二区在线观看| 亚洲国产精品www| 国产麻豆精品在线| 成人免费视频入口| 色综合久久中文字幕| 91电影在线播放| 国产精品视频区| 你懂的视频欧美| 黄色动漫网站入口| 成人免费毛片aaaaa**| 日本一级二级视频| 亚洲精品v欧美精品v日韩精品| 欧美黑人猛交的在线视频| 成人在线观看视频网站| 国产91免费看| 亚洲国产91色在线|