#pragma pack 會要求compiler 使用特別的對齊方式來包裝 Structure Member . 大多數的compilers, 當你宣告一個結構時, 將會在彼此成元之間插入 padding 來確保他們在記憶體中的對齊。下面舉個例子:
struct Test
{
char AA;
int BB;
char CC;
};
compiler 可能會在記體中選擇以下列的方式來排列對齊:
| 1 | 2 | 3 | 4 |
| AA(1) | pad..............................|
| BB(1) | BB(2) | BB(3) | BB(4) |
| CC(1) | pad..............................|
雖然真正的資料只佔了6 (byte),但是 sizeof(Test) 結果會是 4 × 3 = 12(byte)
#pragma比較常使用的時機,是在與Hardware device作溝通的時候,你為了要確保compiler不會插入padding,這時候你就會使用 #pragma pack(1),而結構的排列就會如下:
| 1 |
| AA(1) |
| BB(1) |
| BB(2) |
| BB(3) |
| BB(4) |
| CC(1) |
sizeof(Test) 結果就會變成 1 × 6 = 6(byte).
如果是使用 #pragma pack(2), 結構的排列就會如下::
| 1 | 2 |
| AA(1) | pad... |
| BB(1) | BB(2) |
| BB(3) | BB(4) |
| CC(1) | pad... |
sizeof(Test) 結果就會變成 2 × 4 = 8(byte).
下面是一個簡單的範例,我們使用#pragma pack(1),並印出structure 大小:
================== pragma.c ==========================
#include <stdio.h>
int main()
{
#pragma pack(1)
struct test {
char A;
int B;
char C;
};
typedef struct test Struct_Test;
Struct_Test AA;
#pragma pack()
printf("Sizeof Struct_Test is %d\n", (int)sizeof(AA));
return 0;
}
====================================================
執行結果:
沒有留言:
張貼留言