结构体成员数组占用空间
#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++服务器开发