c++ - 一个空的class在内存中的大小问题
高洛峰
高洛峰 2017-04-17 13:54:32
0
8
404

比如有一个类定义如下:

class A{
};

当我们构造一个A类型的对象a,用sizeof(a)得出来的结果是1,在深入理解C++对象模型一书中,有如下的解释:
它有一个隐晦的1byte,那是被编译器安插进去的一个char,这使得这个class的两个objects得以在内存中配置独一无二的地址...

问题来了,为什么安插一个1byte的char就能配置出独一无二的地址?是怎么做到的?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(8)
巴扎黑

如果内存中连一个字节都没有分配,那自然没有一个内存地址可以表示这个对象,但即使只分配一个1Byte,也能保证这个对象分配到一个唯一的地址。

刘奇

请参看这个链接:http://stackoverflow.com/questions/2362097/why-is-the-size-of-an-empty-class-in-c-not-zero

C++标准不允许出现占用内存为0的类,因为如果有这样的类,就可能出现两个不同的类对象占据相同的内存地址的现象。

Peter_Zhu

C++里标准规定最小的对象,包括原生类型char/int等的值最小为1,主要是用于区分不同的对象的,试想你如果new出来的东西不占有内存怎么办? 再者,如果你的空类地址为0,那按理推论,是不是空类的数组大小也为0了? 这显然是一个悖论

伊谢尔伦

这是因为内存的最小寻址单位就是1字节。
也就是说8bit是一个整体,是对内存操作的最小单位。8bit是一个字节。
因为整数的最小单位就是 1 ,而内存地址是一个整数,所以内存中每一个字节都有一个唯一的整数来代表它的内存地址。也就是每一个字节的地址都是独一无二的。
注:上述言论只是简单的说明问题,不严谨。没有说明多进程,虚拟地址等。

迷茫
问题来了,为什么安插一个1byte的char就能配置出独一无二的地址?是怎么做到的?

楼主这个问题需要重新描述。这里没有什么魔术,类是产生对象的模板,而对象必须有大小才能在内存中得到分配,因此给1个字节或多个字节的作用是一样的。

Ty80

为了区分两个不同的对象的地址

迷茫

只是分配内存而已,1字节是最小分配单位,要分配2、3、4字节都可以,但是就浪费内存了
所以编译器编译后的程序,只会分配最少的内存,也就是1字节咯

至于独一无二,内存地址当然就是唯一的啊,如果两块内存地址一样,
那怎么读写他们呢?内存操作都是通过地址来进行
地址就是他们的ID(唯一确定的身份证),这样理解就好了

伊谢尔伦

你分一块内存1byte,这就是机器唯一的

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!