看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《u8906250 (羊咩咩)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : GCC : 問題(Question): : 比如說有一個 struct : struct ggg { : int len; : void *data; : }; : 是否能在 malloc struct 的同時也 malloc data的大小1024 : 看起來像是 : struct ggg *g = malloc (sizeof(struct ggg)+1024) : 但沒辦法這樣做 : 請問是否能做呢? http://hedgezzz.pixnet.net/blog/post/32846299 我有一篇關於 struct hack 的文章,或許可提供一些拙見!! -- 去年今日此門中,人面桃花相映紅。人面不知何處在?桃花依舊笑春風。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.169.49.59
rephansu:我怎麼覺得你的文章不太正確, X_和Y_的描述不對啊 01/26 07:59
rephansu:或許這在VC2010和GCC上結果不同, 我目前只能試VC2010 01/26 08:06
barfat:不同 OS,不同 compiler 會有不同的結果 01/26 08:51
barfat:64 bits OS ,pointer has 8 bytes 01/26 08:52
barfat:32 bits has 4 bytes 01/26 08:52
barfat:compiler 必須做到 stru 裡面的變數,都必須放在此變數長度, 01/26 08:58
barfat:的倍數上的記憶體位址,所以 long 如果是 8 bytes的話 01/26 08:59
barfat:它必須在 8 的倍數的記憶體上 , structure A_ arrvar[10] 01/26 09:01
barfat:compiler 必須做到 structure array 每個變數都合乎這規則 01/26 09:02
barfat:X86_64 one cache line has 64 bytes,如果你的 long 不是8 01/26 09:03
barfat:倍數的話,就可能發生 long 變數跨過 兩條 cache lines 01/26 09:04
barfat:那麼 , concurrency atomic 上就會出現問題 01/26 09:05
barfat:我是指"long變數memory location不是8倍數的話" ... 01/26 09:06
rephansu:如果要用對或錯來判定你的解釋, 我認為是錯的, 01/26 10:01
rephansu:你可以試著把age 和 name[0]用各種型別帶入測試, 01/26 10:02
rephansu:例如char , short , long long 01/26 10:02
rephansu:我想很快的你會發現跟你的解釋有些出入 01/26 10:03
rephansu:sizeof(X_)會8是因為sizeof(char *)是8,因此要擴充到8 01/26 10:09
rephansu:這只是struct alignment預設行為是這樣, 跟cpu實作無關 01/26 10:11
rephansu:畢竟struct alignment也可以設定為1byte 01/26 10:14
rephansu:嗯...想了一下其實是在講差不多的事情,忘記上面說的吧XD 01/26 10:21