比如有一个类定义如下:
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(唯一確定的身份證),這樣理解就好了