Re: [問題] sizeof(size_t) 之倍數

看板EE_DSnP作者 (踢屁屁)時間12年前 (2011/11/19 00:30), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
看了這篇我也想了一個小時... 但我自己的理解是這樣... 非常沒有把握 說不定會誤導大家XDDD 還是請老師出面說明比較好... :※ 引述《vincere (vin)》之銘言: :因為想了一個晚上 :雖然有聽老師講過、爬過文 :但感覺還是沒有完全地了解 :不太敢隨便下手 :所以想要請教大家一下 :我知道要取sizeof(size_t)之倍數記憶體的原因 :是為了做到platform dependent :因為系統在new的時後 :會對齊size_t為倍數的位置 之所以一次給size_t的倍數大小記憶體 應該是因為作業系統匯流排一次傳輸的bits數就是這麼大 32位元一次讀32 bits(4 bytes) 64位元一次讀64 bits(8 bytes) :但在作業中 :我們先自己跟系統要一塊memory :來後再根據new多少再來分配記憶體 :但這裡我不是很清楚的是 :為何對自己要到的記憶體 :不能依照真正object大小來要 :而是也要跟系統一樣要sizeof(size_t)為倍數的記憶體大小呢? :舉例說: :一開始可能將0x00000000~0x00000007位置的記憶體分配出去 :然後下次再從0x00000008開始開始 :原因是因為 :就算是我們自己已經要來的MemBlock, :也無法aceess/或是指到非sizeof(size_t)倍數的記憶體? 我認為pointer應該是bytewise的耶 所以可以acess到非size_t倍數大小位址的記憶體 以64-bit系統來說 就只是把包含你要acess的位址部分的memory一次讀出來 例如0x00000006就是讀出0x00000000~0x00000007然後acess第7個byte之後的東西 :還是說只是單純要模仿機器每次都切齊sizeof(size_t)倍數的記憶體位置呢? 所以我認為我們是在模仿機器每次給記憶體的方式(4 byte倍數 or 8 byte倍數) 目的是為了讓我們在自己管理的memory情況下 pointer也能像平常一般下使用不出錯 譬如說 在64-bit系統下 假設今天有一個class A實際大小是39 bytes 如果我們不模仿系統存記憶體會以倍數存且留空位的話 今天假設宣告A* ptr = new A [2]; 若計算兩個物件A占用的記憶體大小 系統總共用了80 bytes存放 而我們用了78 bytes存放(依此類推...) 則 如果要以*(ptr + 1)來acess ptr[1] 後者就會出錯! :或是另有其它隱情? :不好意思小的觀念不清 :懇請解惑 :感激不盡 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.25.106 ※ 編輯: vincere 來自: 140.112.25.106 (11/18 14:13)

11/18 15:37,
因為new[n]的時候 系統會要求對齊後bytes*n+SIZE_T
11/18 15:37

11/18 15:38,
所以中間一定會有一些零碎bytes是系統會空掉的
11/18 15:38

11/18 16:18,
所以意思是說 假如我在new的過程中 想要拿memory block中
11/18 16:18

11/18 16:20,
*(_ptr+5)所相對的記憶體時沒辦法的?而是它會要求對應的
11/18 16:20
所以依我的想法來說 *(_ptr + 5)當然可以acess到位址真的是_ptr + 5的記憶體內容...

11/18 16:22,
*(ptr+8)開始的位置?如果我強制assign給它程式是否會
11/18 16:22

11/18 16:22,
crash掉?如果想錯懇請糾正
11/18 16:22

11/18 17:19,
應該是沒辦法 因為new operator會自動用他的!
11/18 17:19

11/18 17:32,
感激:) 似乎比較瞭解了
11/18 17:32
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.252.206 ※ 編輯: kickpp 來自: 140.112.252.206 (11/19 01:13)

11/19 06:41, , 1F
非常感謝你:)))
11/19 06:41, 1F
文章代碼(AID): #1EneWim- (EE_DSnP)
文章代碼(AID): #1EneWim- (EE_DSnP)