当前位置:网站首页>结构体的内存对齐问题
结构体的内存对齐问题
2022-08-10 03:29:00 【iccoke】
结构体的内存对齐
结构体的大小不是结构体元素单纯相加就行的,因为我们主流的计算机使用的都是32bit字长的CPU,对这类型的CPU取4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素时就会相对更高效,这就是内存对齐的由来。每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。
结构体内存对齐规则:
第一个成员在结构体变量偏移量为0 的地址处。
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数与该成员大小中的较小值。vs中默认值是8 Linux默认值为4.
结构体总大小为最大对齐数的整数倍。(每个成员变量都有自己的对齐数)
如果嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(包含嵌套结构体的对齐数)的整数倍。
结构体内存对齐规则的应用
例如这里我们定义一个结构体,应用结构体内存对齐原则我们进行结构体大小的判断
struct Student {
short b;
char c;
int a;
long int d;
double g;
};
直接简单加法的话,这个结构体的大小应该是19;那么我们打印一下他的大小
实际上应该是24,那么我们是怎么得到这个24的呢
首先b先存入内存中,那么c存入时对于的地址就是2,时c的整数倍,那么c就可以存到3这个位置,然后再存入a,对应的首地址是3,不是int 的整数倍,我们就要在c后面浪费一个字节使其满足结构体的内存对齐规则,然后再存入d,地址是8,是long int的整数倍,最后再存入g,地址是12,不是double的整数倍,然后应该在d后面浪费4个四个字节以求满足结构体的内存对齐问题,然后最后在判断整个结构体的大小是不是结构体内最大基本类型和默认内存对齐数中比较小的数的整数倍,double 类型占8个字节,vs中默认结构体对齐数是8,所以大小应该是8的整数倍,我们判断为24是正确的,符合内存对齐的规则
那么对于嵌套的结构体我们又该如何计算呢,这里我们举一个例子
struct S1
{
double d;
char c;
int i;
};
struct S2
{
char c1;
struct S1 s3;
double d;
};
printf("%d\n", sizeof(struct S2));
那么这里的结果应该如何来看呢,应该是32,这里我们放到内存上来看就会比较清晰
当计算完得到结果之后一定要严格的按照结构体的内存对齐规则进行验证
//* #pragma pack(字节) 对齐方式开始 预处理指令
//* #pragma pack() 对齐方式结束 预处理指令
这个指令可以改变系统提供的默认对齐数
例如#pragam pack(1)
#pragma pack()
这个分别使用在结构体的前后,这样既可以让结构体的对齐书改为1使用
结构体实际上是牺牲空间换取时间上的便利
边栏推荐
猜你喜欢
shell文本编辑awk
快35了,还在“点点点”?那些入行几年的测试点工后来都怎么样了?
如何快速成为一名软件测试工程师?测试员月薪15k需要什么技术?
什么是Jmeter?Jmeter使用的原理步骤是什么?
It's almost 35, still "did a little"?What happened to the test workers who had been in the industry for a few years?
怎么进行服务器性能监控,有什么监控工具
所谓软件测试工作能力强,其实就是这 5 点
电话自动拨号在电脑上自动拨打
黑马jvm课程笔记d2
软件的生命周期(软件工程各阶段的工作)
随机推荐
The so-called software testing ability is actually these 5 points
Flink CDC 2.0及其他数据同步工具对比
轻流CEO薄智元:从无代码到无边界
UDP协议之《套接口阻塞选项UDP_CORK》
(面试加分新技能) 总结11个ES2022中你可能遗漏的语法
TCP协议之《延迟ACCEPT》
测试常见问题100类(1)
基础理解网络模型
maya图片如何导入
Shell 文本三剑客 awk
常用类以及接口
The same is a primary test, why does he pay 5,000 yuan more than me?
Flink学习15:Flink自定义数据源
Camera partial update
动态网页开发基础
TCP协议之《Out-Of-Window报文限速》
【网络迁移】Pytorch中的F.interpolate对应MindSpore哪个方法
Mini Program Navigation and Navigation Parameters
js阻止事件冒泡方案
mysqldump和XBK备份