2016-07-26 52 views

回答

12

大約有對準結構是值得一提的幾個事實:

  1. 一個類型的大小始終是其對齊的倍數。
  2. 結構的對齊總是其所有成員對齊的倍數。

因此,由於其中一個成員具有4096的對齊方式,結構本身的對齊方式至少爲4096.它很可能就是這樣。

但是由於它需要在c之前填充4080個字節,結構的大小至少爲4104,但它必須是4096的多重對齊。所以它增長到8192.

4

這是因爲sizeof告訴陣列中下一個元素的位置。也就是說,如果你有申報

struct A a[2]; 

您將需要兩個a[0].ca[1].c4096字節對齊。

嚴格地說編譯器可以管理要做到這一點,大小爲4096,但它並不可能因爲struct A將繼承對齊要求和放兩個int S中.c字段,它也必須被整列前插入4080.b.c之間填充的ish字節,然後在.d之後填充012h。

編譯器可能已經做到這一點(不重新安排結構成員)的方式是擴展對齊的概念。除了要求地址必須位於表格N*4096的地址之外,它可以用一個偏移來擴展它,要求它落在N*4096-2*sizeof(int)的地址上。給出struct A這樣的要求將導致.c元素自然變成4096字節對齊,而不需要在.b.c(也)之間填充。

+3

編譯器*不*可以隨意重新排列struct成員。 C標準要求指向'a'的指針也是一個指向封閉對象的指針,所以下面是合法的:'int * ptr = &t.a;((struct A *)ptr) - > b = 42;'因此,編譯器*不能*設法將給定的結構打包在4096字節內。 – cmaster

+0

@cmaster重新排列成員不是使其工作的唯一方法,大小爲4096字節。編譯器可能還要求'struct A'在'4096'字節邊界之前需要一個地址'2 * sizeof(int)'。 – skyking

相關問題