#pragma pack(n)
2016-12-28 22:42
381 查看
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
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- 浅谈C语言转义字符和格式控制符
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- 利用C语言的Cairo图形库绘制太极图实例教程
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方