3 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
我之前提過 C 標(biāo)準(zhǔn)沒有規(guī)定對齊值。題目應(yīng)該說明這些,但沒有,所以我只能按照 double 占 8 字節(jié),對齊值也是 8 來推算。
union 占用的內(nèi)存就是其最大成員占用的,所以 u_type 占用 8 字節(jié),對齊值也是 8。
struct 的第一個(gè)成員 str 是數(shù)組,占用 100 字節(jié),這沒有問題。第二個(gè)成員 u 占 8 * 2 字節(jié)也沒有問題。關(guān)鍵是 u 數(shù)組可以緊接著前面的 str,從第 101 字節(jié)開始放置嗎?
答案是不能。因?yàn)楸仨殱M足 u_type 對齊值 8 的要求,而 100 個(gè)字節(jié)之后第一個(gè)滿足 8 倍數(shù)的是 104,所以 u 數(shù)組應(yīng)從第 105 字節(jié)開始放置。
還有一點(diǎn)是我在 146 題的回答略掉的內(nèi)容:struct 本身的大小也必須是其對齊值的倍數(shù)。struct 的對齊值一般是其成員對齊值中最大的,所以 struct str_type 的對齊值也應(yīng)是 8。
這樣 struct str_type 目前就占用 104 + 8 * 2 = 120 個(gè)字節(jié)。120 剛好也是 8 的倍數(shù),所以結(jié)尾處也不需要填充空位了。整個(gè) struct 的大小就是 120 字節(jié)。

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
在前面 146 題那里,我對你的理解進(jìn)行了下“修正”,再次強(qiáng)調(diào)了對齊值的存在。
double 占 8 字節(jié),所以 union 占 8 字節(jié)沒錯(cuò)。而 union 的對齊值是 int、double、float 這三個(gè)類型的對齊值中最大的一個(gè)。? 我們是假定 double 的對齊值是 8,才得出 union 的對齊值是 8 這個(gè)結(jié)論的。
對此,我一直強(qiáng)調(diào)題目不嚴(yán)謹(jǐn),沒有給出類型的對齊值。 事實(shí)上,就我明確知道的,在某些平臺下,double 的對齊值是 4。? 所以我一直說,我只是猜測出題人預(yù)想的對齊值來進(jìn)行假設(shè)計(jì)算。
所以也不能說“而100不是union的整數(shù)倍”,而是“100不是union的對齊值的整數(shù)倍”——在我猜測 union 對齊值是 8 的前提下。
后面你應(yīng)該也能猜到我要說什么了:
不是“結(jié)構(gòu)體大小必須是所有成員大小的整數(shù)倍,即所有成員大小的公倍數(shù)”,而是“結(jié)構(gòu)體大小必須是其對齊值的整數(shù)倍”。
當(dāng)然這道題在我們假定 union 的對齊值是 8,struct 的對齊值是 8 的前提下,確實(shí)是“1 和 8 的整數(shù)倍”
所謂強(qiáng)調(diào)“整數(shù)倍關(guān)系”實(shí)際上是要“滿足對齊要求”,即要推算出正確的對齊值,再算出是否需要偏移。
- 3 回答
- 1 關(guān)注
- 1342 瀏覽
添加回答
舉報(bào)