当前位置:网站首页>对C语言结构体内存对齐的理解
对C语言结构体内存对齐的理解
2022-08-01 21:02:00 【panfei263031】
参考文章:
C语言问题集——结构体及其内存对齐
Linux字节对齐的那些事
linux中,默认情况下,没有默认的对齐数,结构体中各个成员的类型占内存大小就是该成员的对齐数,所以对于结构体内存对齐,有如下规则:
1、第一个成员存放在内存偏移为0的地址处;
2、结构体中各个成员的类型占内存大小就是该成员的对齐数,各成员存放的起始地址应该是对齐数的整数倍;
3、整个结构体大小应该是该结构体中最大成员的对齐数的整数倍。
引用一下第二个参考连接中的话,就是:
二、对齐规则
对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐: 数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。 联合 :按其包含的长度最大的数据类型对齐。 结构体: 结构体中每个数据类型都要对齐。
但是也可以通过#pragma pack (n)伪指令设置默认对齐数,例如设置为4字节对齐,通过伪指令#pragma pack ()取消默认对齐数设置。
如果设置了默认的对齐数,对齐规则稍有变化,引用上述第二个参考连接中的描述:
#pragma pack(n) 用来设定变量以n字节对齐方式。 n字节对齐就是说变量存放的起始地址的偏移量有两种情况:
1、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式
2、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
结构的总大小也有一个约束条件,如果n大于等于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须是n的倍数。
接下来我们用同一个结构体,在没有设置默认对齐数和设置了4字节对齐两种情况下,分别测试该结构体的内存占用情况。
没有设置默认对齐数
测试代码:
#include<stdio.h>
#define offset(type, mb) (size_t)&(((type *)0)->mb)
#define print_offset(type, mb) printf("sizeof %s: %lu, index of %s: %lu\n", #type, sizeof(type), #mb, offset(type, mb))
typedef struct test_st
{
char a;
double b;
short c;
int d;
double e;
char f;
char g;
char h;
}test_st;
void main(void)
{
print_offset(test_st, a);
print_offset(test_st, b);
print_offset(test_st, c);
print_offset(test_st, d);
print_offset(test_st, e);
print_offset(test_st, f);
print_offset(test_st, g);
print_offset(test_st, h);
}
运行结果如下:
[email protected]:~/111# ./a.out
sizeof test_st_st: 40, index of a: 0
sizeof test_st_st: 40, index of b: 8
sizeof test_st_st: 40, index of c: 16
sizeof test_st_st: 40, index of d: 20
sizeof test_st_st: 40, index of e: 24
sizeof test_st_st: 40, index of f: 32
sizeof test_st_st: 40, index of g: 33
sizeof test_st_st: 40, index of h: 34
内存对齐的情况描述如下:
根据上述分析,上述结构体占40字节的内存。
设置4字节对齐
代码和上述差不多,就是在结构体定义的前后增加#pragma pack(4)和#pragma pack()的设置,运行结果如下:
[email protected]:~/111# ./a.out
sizeof test_st: 32, index of a: 0
sizeof test_st: 32, index of b: 4
sizeof test_st: 32, index of c: 12
sizeof test_st: 32, index of d: 16
sizeof test_st: 32, index of e: 20
sizeof test_st: 32, index of f: 28
sizeof test_st: 32, index of g: 29
sizeof test_st: 32, index of h: 30
从这两个实验的结果来看,确实符合上述对齐规则。
边栏推荐
- 微信小程序云开发|个人博客小程序
- Pytorch学习记录(八):生成对抗网络GAN
- 如何封装 cookie/localStorage/sessionStorage hook?
- 乐观锁批量跟新 纯SQL
- [Energy Conservation Institute] Application of Intelligent Control Device in High Voltage Switchgear
- WeChat applet cloud development | personal blog applet
- Kubernetes 如何实现组件高可用
- Nacos 配置中心
- 技术栈概览
- 基于FPGA的任意字节数(单字节、多字节)的串口(UART)发送(含源码工程)
猜你喜欢
Interview assault 70: what is the glue bag and a bag?How to solve?
[Energy Conservation Institute] Application of Intelligent Control Device in High Voltage Switchgear
数据库单字段存储多个标签(位移操作)
R语言 数据的关系探索
Nacos 配置中心
响应式织梦模板美容整形类网站
面试突击70:什么是粘包和半包?怎么解决?
关于Request复用的那点破事儿。研究明白了,给你汇报一下。
Pytorch学习记录(八):生成对抗网络GAN
STAHL touch screen repair all-in-one display screen ET-316-TX-TFT common faults
随机推荐
Questions I don't know in database kernel interview(1)
Interview assault 70: what is the glue bag and a bag?How to solve?
Where should I prepare for the PMP exam in September?
【接口测试】JMeter调用JS文件实现RSA加密
Pytorch框架学习记录8——最大池化的使用
在Cesium中实现与CAD的DWG图叠加显示分析
tiup mirror genkey
C陷阱与缺陷 第8章 建议与答案 8.1 建议
New graduate students, great experience in reading English literature, worthy of your collection
Custom command to get focus
封装一个管理 url 状态的 hook
任务调度线程池基本介绍
win10版本1803无法升级1903系统如何解决
Remove 360's detection and modification of the default browser
乐观锁批量跟新 纯SQL
图的邻接矩阵存储
StringTable Detailed String Pool Performance Tuning String Concatenation
C陷阱与缺陷 第5章 库函数 5.5 库函数signal
网络安全与基础设施安全局(CISA):两国将在网络安全方面扩大合作
线上问题排查常用命令,总结太全了,建议收藏!!