首頁  >  問答  >  主體

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

比如有一个类定义如下:

class A{
};

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

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

高洛峰高洛峰2766 天前411

全部回覆(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
  • 取消回覆