__declspec(align(#))

在覈心編程中看到上面這樣的東西,雖然懵懵懂懂知道是與字節對齊相關,

 

但還是想知道究竟是怎麼回事,順着書中提供的相關網站,看了下資料,

 

評介僅有的一點英文水平,記錄下來。

 

align Examples:

 

下面的一些例子展示了 __declspec(align(#))是怎樣影響結構體數據的對齊的,

 

例子假設下面的定義:

 

 

下面這個例子,S1結構體用__declspec(align(32))定義,所有S1的使用,不論是變量的定

 

義還是其他類型的定義,都會保證這個結構體是以32個字節對齊。sizeof(struct S1)返回

 

32,並且在S1結構體容納四個整形的16個字節後又增加了16個字節。每個整形成員需要4個

 

字節對齊,但是結構體本身聲明爲32字節對齊,所以總體的對齊是32個字節。

 

 

下面的例子,sizeof(struct S2)將要返回16,這着實是所有成員變量相加的和。因爲這個和

 

就已經是成員中最大變量對齊需要字節數的倍數

 

 

下面的例子,sizeof((struct S3)將返回64.(S3從S1繼承了對齊方式)

 

 

 

 

下面的例子,注意a只有自然的對齊方式,也就是4個字節,但是S1必須以32個字節對齊,這

 

樣將會有28個字節添加到a的末尾來保證S1以32字節對齊,S4仍久會繼承S1的對齊方式,因

 

爲在這個結構體中最大的字節需求也就是S1的需求,所以sizeof(struct S4)返回64

 

 

 

下面的三個變量同樣使用了__declspec(align(#)),在每種情形,變量必須以32字節對齊,對

 

於數組,只是數組的基址要以32字節對齊,而不是每個元素都要被__declspec(align(#))所

 

影響。

 

 

如果想要將數組中的每個元素都有這樣的對齊方式(32),我們應該向下面這樣做。

 

 

在下面例子中,格外注意的是對齊結構體本身和對齊結構體的第一個元素是等價的。

 

 

S6和S7有相同的對齊方式,內存分配方式以及大小。

 

 

For Reference Only

發佈了45 篇原創文章 · 獲贊 3 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章