C++ 空白基類最佳化(EBO 或 EBCO)

來源:互聯網
上載者:User

標籤:c++   類   編譯器   最佳化   sizeof   

對於c++中的一個空類 

class X
{
}; 

事實上並不是空的,sizeof(X)並不等於0, 一般的結果是1。每個X的對象都有一個隱晦的1 bytes,是被編譯器安插進去的一個char,這樣可以使得這個class的兩個objects在記憶體中配置獨一無二的地址。

當X作為另一個類的成員時,如:

class A
{
public:
    X x;
    int a;
};

由於X佔一個位元組,int佔4個位元組,再加上編譯器的alignment調整,sizeof(Y) = 8。

但是當一個類繼承X時:

class Y : public X
{
public:
    int a;
};

這時大部分編譯器對於sizeof(Y)的結果是4,而不是8。這就是所謂的空白基類最佳化在(empty base optimization-EBO 或 empty base class opimization-EBCO)。在空基類被繼承後由於沒有任何資料成員,所以子類最佳化掉基類所佔的1 byte。EBO並不是c++標準所規定必須的,但是大部分編譯器都會這麼做。



下面是做的測試
#include<iostream>using namespace std;class Empty{};class Son1:public Empty{};class Component {  int x;  Empty t;      };class Son2:public Empty{  int x;      };int main(){   Empty t;      printf("size of Empty: %d\n",sizeof(Empty));//1,被編譯器安插進去的一個char,這樣可以使得這個class的兩個objects在記憶體中配置獨一無二的地址    printf("size of t: %d\n",sizeof(t));        //1   printf("size of Son1: %d\n",sizeof(Son1));  //1   printf("size of Component: %d\n",sizeof(Component));  //8,位元組對齊    printf("size of Son2: %d\n",sizeof(Son2));  //4,空白基類最佳化       system("pause");   return 0; }
參考:http://blog.csdn.net/luckyxiaoqiang/article/details/8494235

有人可能會問是否需要考慮this指標?

我覺得是不需要考慮的。首先看一下this指標的定義:C++ this 指標。this 指標是作為參數傳遞給每個成員變數的。它是指向本類對象的指標,它的值是當前被調用的成員函數所在的對象的起始地址。也就是說this指標是不存在於成員變數中的。

C++ 空白基類最佳化(EBO 或 EBCO)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.