Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...
在windows下設置字節對齊大小的方式,目前我了解有三種:
1. 在編譯程序時候的編譯選項 ?/Zp[n],如 cl /Zp4 表示對齊大小是4字節;
2. 預處理命令 ? #pragma pack( [ show ] | [ push | pop ] [, identifier ] , n? );
3. 微軟特定命令 ?__declspec(align(#))。
下面我將分別介紹這三種,并分析不同方式的優缺點,先明確下字節對齊大小都是2的指數倍如1,2,4,8,16,32等。
方法一的用法最為簡單,只需要在編譯選項設置就行,該方式將作用于整個模塊,因此是全局性的,不夠靈活。
方法二的用法復雜點,但該方法可以在一個模塊中不斷的設置字節對齊大小,靈活性很強,針對不同的結構體采用不同的對齊大小,很適合這種方法,但用法較為復雜。
方法三的方法主要是作用于整個結構體上,是加強了字節對齊的限制,如將整個結構體對齊為64字節,不管里面元素總的大小,則結構體大小為大于總大小的最小的64倍數。
結構體大小的確定以及每個元素位置的確定:
對齊大小為 align(方法一和方法二設置的值,在vs2013中默認為8字節)、結構體中元素字節最大為max、結構體對齊align_struct(由方法三進行設置)
? ? ? ?假設內存是一個一個籃子用于存放結構體的每個變量, 而籃子肯定有大小 ? = min(align, max)大小為對齊大小和元素字節最大的 較小者。
下面就是將元素放入籃子的問題,有個原則是:
"The alignment of a member will be on a boundary that is either a multiple ofn or a multiple of the size of the member, whichever is smaller."
每個元素放置的位置 要么是 對齊大小的整數倍,要么是 該元素大小的整數倍,比較這兩個值,哪個小就放在那。
若沒有方法三設置,則最后結構體的大小就為籃子 大小的倍數,若有方法三的設置最后在考慮結構體整體的字節對齊。下面舉個例子:
typedef struct A {char ca;int ib;short sc;int id;double de; }A;
若對齊大小align=4, 則 max = 8 = sizeof(double), 籃子大小為 min(4,8) = 4.
char ca 放在第一個籃子中, 偏移為0
int ib 要放在的位置必須為4的倍數,所以放在第二個籃子中,偏移為4
short sc 要放在的位置為2的倍數, 所以放在第三個籃子中,偏移為8
? ? ? ?int id要放在位置為4的倍數, 第三個籃子沒有這樣的位置,所以放在第四個籃子中,偏移為12
? ? ? double要放在位置為4的倍數,放在第五個籃子和第六個籃子中,偏移為16,
可以看出總共用了6個籃子,總大小sizeof(A) = 24.
若添加方法三在結構體上 如下
typedef struct __declspec( align( 32) ) A {char ca;int ib;short sc;int id;double de; }A;修飾結構體的對齊大小為32,則sizeof(A) = 32 ,但每個元素在該結構體中偏移和上面都一樣,只是在結構體的末尾添加字節用于對齊。? ? ? 現在只是簡單介紹了三種方法和結構體大小的確定 ,將在后面具體介紹方法二和方法三的用法。
轉載于:https://www.cnblogs.com/liwugang/p/7594101.html
總結
以上是生活随笔為你收集整理的Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 疯狂Java讲义笔记整理
- 下一篇: 利润表模板excel_Excel 最新财