#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
- #pragma pack(n) ........ #pragma pack()
- 关于 #pragma pack(n)
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- #pragma pack(n)
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- #pragma pack(n)
- #pragma pack(n) 用法
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- 细说 #pragma pack(n)
- 了解#pragma pack(n)
- 【基本解决】CentOS 7中查看PHP运行时的Log文件日志信息
- 1619-7 张良 十二月二十八号总结 [连续第八十九天]
- 1062. 最简分数(20)
- 每天一个 Linux 命令(6):rmdir 命令
- stack的基本用法
- #pragma pack(n)
- Windows平台使用VS2013编译VLC源码
- 【jzoj4932】【贪心】【二分答案】
- table()、tapply()等函数输出的结果取值和应用办法
- 物理材质 - Physic Material
- 程序员健康指南
- Android Studio二维码扫描
- CPU Usage Spiking When Start DBMS On Oracle Linux 6 (Doc ID 1995167.1)
- AddressView的用法与源码详解