Heim > Fragen und Antworten > Hauptteil
比如有一个类定义如下:
class A{
};
当我们构造一个A类型的对象a,用sizeof(a)得出来的结果是1,在深入理解C++对象模型一书中,有如下的解释:
它有一个隐晦的1byte,那是被编译器安插进去的一个char,这使得这个class的两个objects得以在内存中配置独一无二的地址...
问题来了,为什么安插一个1byte的char就能配置出独一无二的地址?是怎么做到的?
怪我咯2017-04-17 13:56:32
请参看这个链接:http://stackoverflow.com/questions/2362097/why-is-the-size-of-an-empty-class-in-c-not-zero
C++
标准不允许出现占用内存为0的类,因为如果有这样的类,就可能出现两个不同的类对象占据相同的内存地址的现象。
天蓬老师2017-04-17 13:56:32
C++里标准规定最小的对象,包括原生类型char/int等的值最小为1,主要是用于区分不同的对象的,试想你如果new出来的东西不占有内存怎么办? 再者,如果你的空类地址为0,那按理推论,是不是空类的数组大小也为0了? 这显然是一个悖论
伊谢尔伦2017-04-17 13:56:32
这是因为内存的最小寻址单位就是1字节。
也就是说8bit是一个整体,是对内存操作的最小单位。8bit是一个字节。
因为整数的最小单位就是 1 ,而内存地址是一个整数,所以内存中每一个字节都有一个唯一的整数来代表它的内存地址。也就是每一个字节的地址都是独一无二的。
注:上述言论只是简单的说明问题,不严谨。没有说明多进程,虚拟地址等。
迷茫2017-04-17 13:56:32
问题来了,为什么安插一个1byte的char就能配置出独一无二的地址?是怎么做到的?
楼主这个问题需要重新描述。这里没有什么魔术,类是产生对象的模板,而对象必须有大小才能在内存中得到分配,因此给1个字节或多个字节的作用是一样的。
迷茫2017-04-17 13:56:32
只是分配内存而已,1字节是最小分配单位,要分配2、3、4字节都可以,但是就浪费内存了
所以编译器编译后的程序,只会分配最少的内存,也就是1字节咯
至于独一无二
,内存地址当然就是唯一的啊,如果两块内存地址一样,
那怎么读写他们呢?内存操作都是通过地址来进行
地址就是他们的ID(唯一确定的身份证),这样理解就好了