许久没有回头研究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/