您的位置:首页 > 编程语言 > C语言/C++

#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语言 字节对齐