84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
比如有一个类定义如下:
class A{ };
当我们构造一个A类型的对象a,用sizeof(a)得出来的结果是1,在深入理解C++对象模型一书中,有如下的解释:它有一个隐晦的1byte,那是被编译器安插进去的一个char,这使得这个class的两个objects得以在内存中配置独一无二的地址...
问题来了,为什么安插一个1byte的char就能配置出独一无二的地址?是怎么做到的?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
如果内存中连一个字节都没有分配,那自然没有一个内存地址可以表示这个对象,但即使只分配一个1Byte,也能保证这个对象分配到一个唯一的地址。
请参看这个链接:http://stackoverflow.com/questions/2362097/why-is-the-size-of-an-empty-class-in-c-not-zero
C++标准不允许出现占用内存为0的类,因为如果有这样的类,就可能出现两个不同的类对象占据相同的内存地址的现象。
C++
C++里标准规定最小的对象,包括原生类型char/int等的值最小为1,主要是用于区分不同的对象的,试想你如果new出来的东西不占有内存怎么办? 再者,如果你的空类地址为0,那按理推论,是不是空类的数组大小也为0了? 这显然是一个悖论
这是因为内存的最小寻址单位就是1字节。也就是说8bit是一个整体,是对内存操作的最小单位。8bit是一个字节。因为整数的最小单位就是 1 ,而内存地址是一个整数,所以内存中每一个字节都有一个唯一的整数来代表它的内存地址。也就是每一个字节的地址都是独一无二的。注:上述言论只是简单的说明问题,不严谨。没有说明多进程,虚拟地址等。
楼主这个问题需要重新描述。这里没有什么魔术,类是产生对象的模板,而对象必须有大小才能在内存中得到分配,因此给1个字节或多个字节的作用是一样的。
为了区分两个不同的对象的地址
只是分配内存而已,1字节是最小分配单位,要分配2、3、4字节都可以,但是就浪费内存了所以编译器编译后的程序,只会分配最少的内存,也就是1字节咯
至于独一无二,内存地址当然就是唯一的啊,如果两块内存地址一样,那怎么读写他们呢?内存操作都是通过地址来进行地址就是他们的ID(唯一确定的身份证),这样理解就好了
独一无二
你分一块内存1byte,这就是机器唯一的
如果内存中连一个字节都没有分配,那自然没有一个内存地址可以表示这个对象,但即使只分配一个1Byte,也能保证这个对象分配到一个唯一的地址。
请参看这个链接:http://stackoverflow.com/questions/2362097/why-is-the-size-of-an-empty-class-in-c-not-zero
C++
标准不允许出现占用内存为0的类,因为如果有这样的类,就可能出现两个不同的类对象占据相同的内存地址的现象。C++里标准规定最小的对象,包括原生类型char/int等的值最小为1,主要是用于区分不同的对象的,试想你如果new出来的东西不占有内存怎么办? 再者,如果你的空类地址为0,那按理推论,是不是空类的数组大小也为0了? 这显然是一个悖论
这是因为内存的最小寻址单位就是1字节。
也就是说8bit是一个整体,是对内存操作的最小单位。8bit是一个字节。
因为整数的最小单位就是 1 ,而内存地址是一个整数,所以内存中每一个字节都有一个唯一的整数来代表它的内存地址。也就是每一个字节的地址都是独一无二的。
注:上述言论只是简单的说明问题,不严谨。没有说明多进程,虚拟地址等。
楼主这个问题需要重新描述。这里没有什么魔术,类是产生对象的模板,而对象必须有大小才能在内存中得到分配,因此给1个字节或多个字节的作用是一样的。
为了区分两个不同的对象的地址
只是分配内存而已,1字节是最小分配单位,要分配2、3、4字节都可以,但是就浪费内存了
所以编译器编译后的程序,只会分配最少的内存,也就是1字节咯
至于
独一无二
,内存地址当然就是唯一的啊,如果两块内存地址一样,那怎么读写他们呢?内存操作都是通过地址来进行
地址就是他们的ID(唯一确定的身份证),这样理解就好了
你分一块内存1byte,这就是机器唯一的