为什么要字对齐?

本文解释了为什么编译器在分配内存时会进行字节对齐,并探讨了字节对齐如何提高CPU的存取速度。通过对缓存交互原理的说明,文章详细介绍了字段对齐的好处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译器为程序分配内存时,为什么要进行字节对齐?什么时候进行字节对齐?

  对如下声明:

  char a[17];

  int i;

  其中i为4字节长度,若编译器对齐方式为4字节,是不是要分配24字节,其中头17个分配给字符型数组a,中间空3字节,后4字节分配给i?这么做有什么好处?

  

  主要是考虑到CPU的存取速度。

  

     因为现代计算机都使用了Cache。

  Cache可以看成一些可以用非常快的速度进行访问的临时内存。但是Cache的容量不大,比如一般一级Cache只有几K到几十K,二级Cache只有几百K到几M.这个同数G的内存相比,是比较小的。

  但是CPU访问内存非常慢,所以硬件会将平时经常使用的内容存放到Cache里面。

因为cache容量有限,不能把内存所有的东西都放进去,所以当CPU要用到一些cache中没有的东西时cache就要从内存调入了,如何调入呢?

一个L1 DATA CACHE相当于一块小的内存,我们假设它为16K大,它会与一般物理内存交互。 
它和内存交互一般一次传输16个字节(32个字节),也就是: 
CACHE 字节0-15一次写到/读取物理内存 ,字节16-31一次写到/读取物理内存.32-47 ... ... 
这些一次被传输的字节被称为cache line。 

假设对象A的一个字段长为16个字节,如果它放在物理地址 0-15,那么它将和cache的第一个cache line 交互,如果放在物理地址 8-23,那么 ,如果CPU要访问这个字段,必须将第一个和第二个cache line 都读入,才能获得这个字段的信息,显然这样速度慢,所以一般字段需要cache line对齐。


内容概要:本文档主要展示了C语言中关于符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定符串中分离出奇偶位置符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对符串并去除其中的空白符;②学会编写能够正确处理奇偶索引符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值