標籤: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)