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/
原文链接: https://www.cnblogs.com/SkyMouse/archive/2012/05/03/2481258.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/49315

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午12:59
下一篇 2023年2月9日 上午1:00

相关推荐