C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。如int型成员的自然对界条件为4字节对齐,而double类型的结构成员的自然对界条件为8字节对齐。若该成员的起始偏移不位于该成员的“默认自然对界条件”上,则在前一个节面后面添加适当个数的空字节。
1.#pragma简述
预处理指令,设定编译器的状态或者指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
2.#pragma pack()的作用
#pragma pack
的主要作用就是改变编译器的内存对齐方式,这个指令在网络报文的处理中有着重要的作用,#pragma pack(n)
是他最基本的用法,其作用是改变编译器的对齐方式, 不使用这条指令的情况下,编译器默认采取#pragma pack(8)
也就是8字节的默认对齐方式,n值可以取(1
, 2
, 4
, 8
, 16
) 中任意一值。
#include <stdio.h>
#include <stdint.h>
#pragma pack (1)
struct Test {
uint32_t var1:24;
uint32_t var2:8;
uint16_t year;
uint8_t moth[3];
};
#pragma pack ()
int main(void)
{
Test var = {1, 2, 3,4,5,6};
printf("sizeof(Test) = %lld\n", sizeof(Test));
printf("%d %d %d %d %d %d\n", var.var1, var.var2, var.year,var.moth[1],var.moth[2],var.moth[0]);
return 0;
}
运行结果: