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