>  Q&A  >  본문

c++ - 一个空的class在内存中的大小问题

比如有一个类定义如下:

class A{
};

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

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

高洛峰高洛峰2717일 전372

모든 응답(8)나는 대답할 것이다

  • 巴扎黑

    巴扎黑2017-04-17 13:56:32

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

    회신하다
    0
  • 怪我咯

    怪我咯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的类,因为如果有这样的类,就可能出现两个不同的类对象占据相同的内存地址的现象。

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:56:32

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

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:56:32

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

    회신하다
    0
  • 迷茫

    迷茫2017-04-17 13:56:32

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

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

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-17 13:56:32

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

    회신하다
    0
  • 迷茫

    迷茫2017-04-17 13:56:32

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

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

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:56:32

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

    회신하다
    0
  • 취소회신하다