當前位置:首頁 > 公眾號精選 > CPP開發(fā)者
[導讀]我們可能都知道,C中空類的大小是1。#include?class?EmptyA?{};int?main()?{???????std::cout?

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

#include?

class?EmptyA?{};

int?main()?{???
????std::cout?<"sizeof?EmptyA?"?<????return?0;
};
結果如下:

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

原因如下:

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

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

直接看代碼:

#include?

class?EmptyA?{};

class?A?{???
????int?a;
};

class?B?:?public?EmptyA?{???
????int?b;
};

class?D?:?public?A?{???
????int?d;
};

class?C?{???
????int?c;??
????EmptyA?d;
};

int?main()?{??
????std::cout?<"sizeof?EmptyA?"?<????std::cout?<"sizeof?B?"?<????std::cout?<"sizeof?C?"?<????std::cout?<"sizeof?A?"?<????std::cout?<"sizeof?D?"?<????return?0;
};
結果如下:

sizeof?EmptyA?1
sizeof?B?4
sizeof?C?8
sizeof?A?4
sizeof?D?8
這里:

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

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

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

EBO技術有什么作用?

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

template
struct?integral_constant?{???
????static?constexpr?_Tp??????????????????value?=?__v;??
????typedef?_Tp???????????????????????????value_type;???
????typedef?integral_constant<_Tp,?__v>???type;
};

typedef?integral_constanttrue>?????true_type;

typedef?integral_constantfalse>????false_type;

template<>
struct?__is_floating_point_helper<float>
:?public?true_type?{?};

template<>
struct?__is_floating_point_helper
:?public?true_type?{?};
STL中各種空類繼承,如果繼承空類會給子類產(chǎn)生額外的大小,那還了得?

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

打完收工。

- EOF -

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。

CPP開發(fā)者

234 篇文章

關注

發(fā)布文章

編輯精選

技術子站

關閉