位元組對齊的問題

來源:互聯網
上載者:User

標籤:os   ar   資料   問題   sp   on   c   linux   r   

對於IA32指令,Linux沿用的對齊策略是:2位元組資料類型的地址必須是2的倍數,而較大的資料類型(int, int*, float和double)的地址必須是4的倍數。

Microsoft Windows對齊的要求更為嚴格--------任何K位元組基本對象的地址都必須是K的倍數,K= 2, 4或者8。

事實上,在擴充到X86-64指令之後,就都是後一種對齊了。

這裡有一點要指出的是,K位元組基本對象,也就是說我們只考慮基礎資料型別 (Elementary Data Type)。

考慮如下幾個結構體:

struct P1{int i; char c; long j; char d;};

i的位移量為0,要求的對齊為4

c的位移量為4,要求的對齊為1

j的位移為8,要求的對齊為8。(不是5,因為那樣不滿足對齊策略)

d的位移為16,要求的對齊為1。

整個結構體佔24位元組,可以分析下,本來17位元組似乎可以,但是考慮各個基本資料的對齊要求,整個結構體佔用的位元組數必須是8的倍數。而且

整個結構體的對齊要求為8。(只考慮基礎資料型別 (Elementary Data Type),所以只要按8對齊就能滿足各項的對齊要求)。

 

第二個結構體:

struct p2{short w[3]; char *c[3];}(64位程式,所以指標為8位元組)

w的位移為0,要求的對齊為2。(再次強調,只考慮基本類型)

c的位移為8,要求的對齊為8。

所以整個結構體佔用的位元組為32,要求的對齊為8。

 

第三個結構體:

struct p3{struct P1 a[2]; struct P2 *p;};

a的位移為0, 要求的對齊為8。

p的位移為48,要求的對齊為8。

所以整個結構體佔用的位元組為56,要求的對齊為8。

位元組對齊的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.