转:
作者:码中飞翔
来源:CSDN
原文:https://blog.csdn.net/wanxuexiang/article/details/86658855
版权声明:本文为博主原创文章,转载请附上博文链接!
c/c++下取消结构体字节对齐方法
在c/c++下编译器会默认地对结构体进行对齐,其对齐的方法跟平台具体的特性有关,本文主要介绍结构体不进行对齐的方法。
1、结构体字节不进行对齐的用途
(1)、减小内存占用的空间
结构体默认进行对齐,占用的空间比结构体内部成员变量字节加起来大,如果取消字节对齐,可以减小一部分空间。见下面具体例子。
(2)、直接将结构体作为通信协议(在低带宽下通讯)
在不同的平台下,保证结构体内基本数据的长度相同,同时取消结构体的对齐,就可以将定义的数据格式结构体直接作为数据通信协议使用。
2、结构体字节不对齐的方法
利用伪指令 #pragma pack (n) 可以动态的调整内存对齐的方式:
#pragma pack (n) // 编译器将按照n个字节对齐;
#pragma pack() // 恢复先前的pack设置,取消设置的字节对齐方式
#pragma pack(pop)// 恢复先前的pack设置,取消设置的字节对齐方式
#pragma pack(1) // 按1字节进行对齐 即:不行进行对齐
---------------------
3、使用示例:
#include <stdio.h>
#pragma pack (1)
typedef struct TestNoAlign
{
unsigned char u8_test1;
unsigned int u32_test2;
double d8_test3;
static int sta_test5; // 静态变量存储在静态区,不在栈中,所以sizeof运算符不会进行计算其占用的空间,此外c语言不只支持结构体内定义static类型的变量,但是c++支持。
}TestNoAlign;
#pragma pack ()
typedef struct TestAlign
{
unsigned char u8_test1;
unsigned int u32_test2;
double d8_test3;
static int sta_test4;
}TestAlign;
int main(void)
{
printf("sizeof(TestNoAlign) is %d sizeof(TestAlign) is %d \n",
sizeof(TestNoAlign),sizeof(TestAlign));
while(1)
{
}
return 0;
}
root@root:/root# ./test
sizeof(TestNoAlign) is 13 sizeof(TestAlign) is 16