#pragma pack(n)

来源:互联网 发布:淘宝开抢怎么抢的 编辑:程序博客网 时间:2024/06/06 09:34

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.cfly_pig@ubuntu:~/Study/C$ ./test_pack sizeof(bipack8)  = 2sizeof(bipack16) = 3sizeof(bipack32) = 5sizeof(bipack64) = 9sizeof(bi8)  = 2sizeof(bi16) = 4sizeof(bi32) = 8sizeof(bi64) = 12
1 0
原创粉丝点击