Re: [問題] 如何一次給定struct以及內部指標記憶體?

看板C_and_CPP作者 (巴肥特)時間10年前 (2014/01/25 16:55), 編輯推噓0(0021)
留言21則, 2人參與, 最新討論串3/4 (看更多)
※ 引述《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

01/26 07:59, , 1F
我怎麼覺得你的文章不太正確, X_和Y_的描述不對啊
01/26 07:59, 1F

01/26 08:06, , 2F
或許這在VC2010和GCC上結果不同, 我目前只能試VC2010
01/26 08:06, 2F

01/26 08:51, , 3F
不同 OS,不同 compiler 會有不同的結果
01/26 08:51, 3F

01/26 08:52, , 4F
64 bits OS ,pointer has 8 bytes
01/26 08:52, 4F

01/26 08:52, , 5F
32 bits has 4 bytes
01/26 08:52, 5F

01/26 08:58, , 6F
compiler 必須做到 stru 裡面的變數,都必須放在此變數長度,
01/26 08:58, 6F

01/26 08:59, , 7F
的倍數上的記憶體位址,所以 long 如果是 8 bytes的話
01/26 08:59, 7F

01/26 09:01, , 8F
它必須在 8 的倍數的記憶體上 , structure A_ arrvar[10]
01/26 09:01, 8F

01/26 09:02, , 9F
compiler 必須做到 structure array 每個變數都合乎這規則
01/26 09:02, 9F

01/26 09:03, , 10F
X86_64 one cache line has 64 bytes,如果你的 long 不是8
01/26 09:03, 10F

01/26 09:04, , 11F
倍數的話,就可能發生 long 變數跨過 兩條 cache lines
01/26 09:04, 11F

01/26 09:05, , 12F
那麼 , concurrency atomic 上就會出現問題
01/26 09:05, 12F

01/26 09:06, , 13F
我是指"long變數memory location不是8倍數的話" ...
01/26 09:06, 13F

01/26 10:01, , 14F
如果要用對或錯來判定你的解釋, 我認為是錯的,
01/26 10:01, 14F

01/26 10:02, , 15F
你可以試著把age 和 name[0]用各種型別帶入測試,
01/26 10:02, 15F

01/26 10:02, , 16F
例如char , short , long long
01/26 10:02, 16F

01/26 10:03, , 17F
我想很快的你會發現跟你的解釋有些出入
01/26 10:03, 17F

01/26 10:09, , 18F
sizeof(X_)會8是因為sizeof(char *)是8,因此要擴充到8
01/26 10:09, 18F

01/26 10:11, , 19F
這只是struct alignment預設行為是這樣, 跟cpu實作無關
01/26 10:11, 19F

01/26 10:14, , 20F
畢竟struct alignment也可以設定為1byte
01/26 10:14, 20F

01/26 10:21, , 21F
嗯...想了一下其實是在講差不多的事情,忘記上面說的吧XD
01/26 10:21, 21F
文章代碼(AID): #1Iutle8i (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Iutle8i (C_and_CPP)