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,這就是機器唯一的