sizeof empty class object

许久没有回头研究c++的一些概念了,突然被一道题考住了大体上如下

class a

{}

//...

a aobj;

size_t aobjSize = sizeof(aobj);

//问aobjSize等于多少?

个人以为aobjSize=4;

毕竟需要有地址空间来储存,而已一般来说每一个对象都有一个this指针所以虽然没有任何成员变量但是仍然应该为4

事实并非如此,写了一下代码发现为1

而且反汇编之后代码如下

...

00031758 mov dword ptr [ebp-4],0
size_t dwSize = sizeof(clsObj);
0003175F mov dword ptr [ebp-24h],1//sizeof(aobj)为什么直接就是1呢?

...

沿着这个问题网上google了一下发现如下:

一、简单对象的存储

1、   基本类型对齐原则:

Char            1

Short          2

Int              4

Long            4

Float            4

Double        8

 

2、   结构体类型对齐原则:(参见《结构体对齐》一文)

以最大成员类型的对齐方式为准,即当需要增长时,增长最大成员类型所占用的字节数

 

3、   静态成员变量不占用类对象的存储空间原则static

静态成员变量所有的类对象共享一份,在静态区域中,并不占用类对象的空间。

 

4、 没有任何成员变量的类对象占用一个字节的空间

对于没有任何成员变量的类(空类),其实它并不是空的,它隐含着被编译器添加了一个char。因为实例化的原因(空类同样可以被实例化),每个实例在内存中都必须有一个独一无二的地址。因此,编译器会给一个空类隐含的加一个字节,使空类在实例化后在内存得到独一无二的地址。

 

原来如此,编译器后台判断出来为空对象之后直接赋予一个char大小的空间,如此sizeof(EmptyClassObject)自然为1

汗那个汗啊。。。

参考网址如下:

http://blog.163.com/niwei_258/blog/static/1062848820109284914229/

posted @ 2012-05-03 20:26  Yarkin  阅读(346)  评论(0编辑  收藏  举报