c++空类的大小

来源:互联网 发布:人人美剧app for mac 编辑:程序博客网 时间:2024/05/20 10:55

定义一个空类,没有数据

class Empty

{
public:
Empty();
~Empty();
protected:
private:

};

cout << sizeof(Empty);输出结果是1.为什么呢?

在大多数编译器中sizeof(Empty)获得1,因为面对“大小为零之独立非附属对象”,通常C++官方勒令默默安插一个char到空对象中。


下面看一下3个类,它们与Empty类有不同的关系

class Test1{private:int i;Empty e;// 复合};class Test2:private Empty//private继承{private:int i;};class Test3:public Empty//public继承{private:int i;};int _tmain(int argc, _TCHAR* argv[]){cout << "Class Test1:"<<sizeof(Test1)<<endl;cout << "Class Test2:"<<sizeof(Test2)<<endl;cout << "Class Test3:"<<sizeof(Test3)<<endl;cin.get();return 0;}
输出结果是:

Class Test1:8

Class Test2:4

Class Test3:4

因为“独立非附属”对象的大小一定不为零,通常C++官方勒令默默安插一个char到空对象中。但是因为需要内存地址对齐,sizeof(int)为4,所以sizeof(Test1)为8.

而当派生类继承Empty类时,会有所谓的EBO(empty base optimization,空白基类最优化),所以sizeof(Test2)和sizeof(Test3)都为sizeof(int)=4.


延伸   对齐问题

(环境vs2010 Projects-Properties-Configuration Properties-C/C++-->Code generation-Struct Member Alignment, 没有修改过,默认值是Default,即8字节对齐)

若定义一个class

class Align

{

private:

int i;

};

则sizeof(Align) = 4。


若class Align

{

private:

char a;

int i;

};

则sizeof(Align) = 8。地址图

char a(占一个地址单元)补齐 补齐补齐int i (占4个地址单元)   

若class Align

{

private:

char a;

short s;

int i;

};

则sizeof(Align) = 8。

char a(占一个地址单元)补齐
short s(占2个地址单元) int i(占4个地址单元)    

若class Align

{

private:

char a;

int i;

short s;

};

则sizeof(Align) = 12。

char a补齐补齐补齐int i  short s 补齐补齐 









0 0
原创粉丝点击