84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
比如有一个类定义如下:
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,这就是机器唯一的