Re: [問題] sizeof(size_t) 之倍數
看了這篇我也想了一個小時...
但我自己的理解是這樣...
非常沒有把握 說不定會誤導大家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,
11/18 15:37
→
11/18 15:38,
11/18 15:38
→
11/18 16:18,
11/18 16:18
→
11/18 16:20,
11/18 16:20
所以依我的想法來說
*(_ptr + 5)當然可以acess到位址真的是_ptr + 5的記憶體內容...
→
11/18 16:22,
11/18 16:22
→
11/18 16:22,
11/18 16:22
推
11/18 17:19,
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
討論串 (同標題文章)
完整討論串 (本文為第 2 之 3 篇):