首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 空白基類別最佳化(EBO)詳解

     編輯:關於C++

現象

空白類別(無非靜態資料成員)大小為 1 byte。組合空白類別會因對齊導致外層類別體積膨脹;私有繼承空白類別可讓編譯器最佳化為 0 大小(EBO)。

程式碼

/*************************************************
 File: test.cpp
 Copyright: C.L.Wang
 Author: C.L.Wang
 Date: 2014-04-11
 **************************************************/
#include <iostream>
using namespace std;

class Empty {};
class HoldsAnInt { private: int x; Empty e; };
class HoldsAnIntP : private Empty { private: int x; };

int main() {
    cout << "Int : " << sizeof(int) << endl;
    cout << "HoldsAnInt(class) : " << sizeof(HoldsAnInt) << endl;
    cout << "HoldsAnIntP(inheritance) : " << sizeof(HoldsAnIntP) << endl;
    return 0;
}

輸出

Int : 4
HoldsAnInt(class) : 8
HoldsAnIntP(inheritance) : 4

原理

  • 組合:Empty e 佔 1 byte,int x 4 bytes,對齊至 8 bytes。
  • 私有繼承:編譯器將空白基類別子物件大小最佳化為 0,僅保留 int x(4 bytes)。

應用場景

  • 標準庫實作中大量使用(如 std::allocator、std::function、std::tuple 的空白基類別)。
  • 自訂政策類別(policy classes)作為模板參數繼承,獲得零開銷抽象。

注意

  • EBO 僅對直接繼承的空白基類別生效,多重繼承多個空白基類別各自佔 0 大小,但最多只能有一個同型別空白基類別(否則位址衝突)。
  • 虛擬繼承空白基類別通常不觸發 EBO(需虛擬基類別表指標)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved