结构体的内存对齐
推算两个就懂规则了:
原因
#pragma 预处理指令,使用可以改变我们的默认对齐数。
#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
#pragma pack(1)//设置默认对齐数为1
struct S2
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
int main()
{
//输出的结果是什么?
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
return 0;
}
vs默认对齐数是8,有时会造成内存浪费
结构体传参
用传址传参,不要用传值传参
struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
传址可以节省空间,加const也可以达到保护原参数的目的
结构体实现位段
不确定因素太多了,少用
(大小端:内存超过一个字节时才会涉及到这个东西)
位段在网络方面应用多
网络工程有各种犄角旮旯的数据,如果都用统一的类型,内存太浪费、传输效率太低