C/C++:结构体内存对齐

结构体成员数组占用空间

#include <stdio.h>
using namespace std;
struct test1{
	int in[3];	
};
struct test2{
	double db[2];	
};

int main(){
	test1 tmp1;
	test2 tmp2;
	printf("%d\n", sizeof(tmp1));
	printf("%d\n", sizeof(tmp2));
} 

在这里插入图片描述

结构体内存对齐规则:

1. 结构体成员的内部偏移量(内部起始地址)要被这个成员的数据类型的大小整除。

#include <stdio.h>
using namespace std;
struct test1{
   char ch;	
   int in;
};
struct test2{
   char ch;	
   double db;
};
int main(){
   test1 tmp1;
   test2 tmp2;
   printf("%d\n", sizeof(tmp1));
   printf("%d\n", sizeof(tmp2));
} 

test1

在这里插入图片描述
test2
在这里插入图片描述

在这里插入图片描述

2. 整个结构体的大小,必须是最大成员的size的整数倍,否则就需要在末尾补充空白字节

#include <stdio.h>
using namespace std;
struct test1{
	int in;
	char ch;	//为使结构体size能整除int的大小,即整除4,需在ch后补3个字节,即[ch][ ][ ][ ]
};
struct test2{
	double db;
	char ch;	为使结构体size能整除double的大小,即整除8,需在ch后补7个字节,即[ch][ ] * 7		
};
struct test3{
	int in;
	double db;
	char ch;	//同test2	
};
int main(){
	test1 tmp1;
	test2 tmp2;
	test3 tmp3;
	printf("%d\n", sizeof(tmp1));
	printf("%d\n", sizeof(tmp2));
	printf("%d\n", sizeof(tmp3));
} 

输出结果同上,但逻辑截然不同。

3. 对于结构体嵌套,按照结构体展开后的内存对齐来处理

#include <stdio.h>
using namespace std;
struct A{
	char c1, c2, c3;		
};
struct B{
	char c4;
	A a;	
};

int main(){
	A a;
	B b;
	printf("%d\n", sizeof(A));
	printf("%d\n", sizeof(B));
}

在这里插入图片描述

4. 人为指定特殊的对其规则

使用#pragma pack(n) //n只能为偶数
指定每个成员的起始地址,按照n来对齐,覆盖第1条规则
注:如果n比第1条规则对齐的数还要大,以小为对齐标准
对之后的所有结构体都适用。

#include <stdio.h>
using namespace std;

struct test1{
	char c1;
	int in;
	char ch;	
};
#pragma pack(2)
struct test2{
	char c1;
	int in;
	char ch;
};
struct test3{
	char c1;
	int in;
	char ch;		
};
int main(){
	test1 tmp1;
	test2 tmp2;
	test3 tmp3;
	printf("%d\n", sizeof(tmp1));
	printf("%d\n", sizeof(tmp2));
	printf("%d\n", sizeof(tmp3));
} 

在这里插入图片描述

5. 不做任何对齐,直接码放数据(不补充任何字节)
使用#pragma pack(1)
用于嵌入式,物联网开发

应用

技术拓展:(非嵌入式开发中)
网络通信,数据包,TCP-UDP,数据包的处理,
数据包都是不作任何对齐的通信协议,为了节省带宽。
低带宽的通信控制比如串口的上位机控制
需要程序员自己封装,解封

网络开发中:
socket,TCP,UDP,组播,多线程通信模型
多进程的通信模型,select,epoll
最有价值的技术是高并发
C++服务器开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值