C語言記憶體對齊詳解(3)

來源:互聯網
上載者:User

標籤:pac   就是   required   logs   關於   不用   amp   round   col   

接上一篇:C語言記憶體對齊詳解(2)

在minix的stdarg.h檔案中,定義了如下一個宏:

/* Amount of space required in an argument list for an arg of type TYPE. * TYPE may alternatively be an expression whose type is used. */#define __va_rounded_size(TYPE)  \  (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))

從注釋以及宏的名字可以看出是有關記憶體對齊方面的作用。根據前兩篇關於C語言記憶體對齊方面的理論可知

n位元組對齊就是說變數存放的起始地址的位移量有兩種情況:

第一、如果n大於等於該變數所佔用的位元組數,那麼位移量必須滿足預設的對齊(各成員變數存放的起始地址相對於結構的起始地址的位移量必須為該變數的類型所佔用的位元組數的倍數);

第二、如果n小於該變數的類型所佔用的位元組數,那麼位移量為n的倍數,不用滿足預設的對齊。

此時n = 4,對於sizeof(TYPE)一定為自然數,sizeof(int) - 1 = 3

sizeof(TYPE)只可能出現如下兩種情況:

(1) 當sizeof(TYPE) >= 4,位移量 = (sizeof(TYPE)/4)*4

(2) 當sizeof(TYPE) < 4,位移量 = 4

此時sizeof(TYPE) = 1 or 2 or 3,而(sizeof(TYPE) + 3) / 4  = 1

為了將上述兩種情況統一,位移量 = ((sizeof(TYPE) + 3) / 4) * 4

 

在有的原始碼中,將記憶體對齊宏__va_rounded_size通過位操作來實現,代碼如下:

#define __va_rounded_size(TYPE)  \   ((sizeof(TYPE)+sizeof(int)-1)&~(sizeof(int)-1))

由於 ~(sizeof(int) – 1) ) = ~(4-1)=~(00000011B)=11111100B

(sizeof(TYPE) + sizeof(int) – 1)就是將大於4m但小於等於4(m+1)的數提高到大於等於4(m+1)但小於4(m+2),這樣再& ~(sizeof(int) – 1) )後就正好將原長度補齊到4的倍數了。

C語言記憶體對齊詳解(3)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.