2018年4月19日 星期四

#pragma pack() 的用途與用法


#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;
}
====================================================

執行結果:


沒有留言:

張貼留言