#pragma pack(n)

C/C++ 數據成員對齊規則利器 #pragma pack(n)

  • C語言中經常遇到數據成員(結構體/聯合體)對齊的問題

  • 編譯器依據硬件環境,會有一套默認的對齊規則,4字節或8字節對齊,目的是減少數據讀取次數(內存讀取到寄存器),加快CPU的計算速度

  • 數據成員對齊帶來的好處是運算性能的提升,但是隨之而來的問題是內存膨脹,尤其是需要大數據量網絡傳輸的場景,此問題尤爲凸顯

  • C/C++ 提供了對數據成員的pack機制,用戶可以選擇需要的對齊方式

/* set packed size */
#pragma pack(n)
struct node 
{
    unsigned char scale;
    long long int val;
}
/* recovery packed size */
#pragma pack()

編程實例

本地實現簡單Demo,代碼例下:


/*
 * Test pragma pack(n)
 * Author: Fly_pig
 */

#include <stdio.h>
#include <inttypes.h>

/* define integer variable */
typedef unsigned char   uint8;
typedef signed   char   int8;
typedef signed   short  int16;
typedef signed   int    int32;
typedef signed long long int64;

/* set packed size to 1 */
#pragma pack(1)

typedef struct 
{
    uint8 scale;
    int8  val;
} bipack8;

typedef struct 
{
    uint8 scale;
    int16 val;
} bipack16;

typedef struct 
{
    uint8 scale;
    int32 val;
} bipack32;

typedef struct 
{
    uint8 scale;
    int64 val;
} bipack64;

/* reset packed size */
#pragma pack()

typedef struct 
{
    uint8 scale;
    int8  val;
} bi8;

typedef struct 
{
    uint8 scale;
    int16 val;
} bi16;

typedef struct 
{
    uint8 scale;
    int32 val;
} bi32;

typedef struct 
{
    uint8 scale;
    int64 val;
} bi64;


int main()
{
    /* print packed struct size */
    printf("sizeof(bipack8)  = %d\n", sizeof(bipack8));
    printf("sizeof(bipack16) = %d\n", sizeof(bipack16));
    printf("sizeof(bipack32) = %d\n", sizeof(bipack32));
    printf("sizeof(bipack64) = %d\n", sizeof(bipack64));
    /* print default packed struct size */
    printf("sizeof(bi8)  = %d\n", sizeof(bi8));
    printf("sizeof(bi16) = %d\n", sizeof(bi16));
    printf("sizeof(bi32) = %d\n", sizeof(bi32));
    printf("sizeof(bi64) = %d\n", sizeof(bi64));
    return 0;
}

執行結果

fly_pig@ubuntu:~/Study/C$ gcc -o test_pack test_pack.c
fly_pig@ubuntu:~/Study/C$ ./test_pack 
sizeof(bipack8)  = 2
sizeof(bipack16) = 3
sizeof(bipack32) = 5
sizeof(bipack64) = 9
sizeof(bi8)  = 2
sizeof(bi16) = 4
sizeof(bi32) = 8
sizeof(bi64) = 12
發佈了40 篇原創文章 · 獲贊 13 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章