首页 文章 精选 留言 我的

精选列表

搜索[自动化研究],共10001篇文章
优秀的个人博客,低调大师

研究字节对齐

今天花了半天好好研读了一下微软这篇文章,基本搞明白了字节对齐。Alignment Alignment and memory addresses Alignment is a property of a memory address, expressed as the numeric address modulo a power of 2 [reference]. For example, the address 0x0001103F modulo 4 is 3. That address is said to be aligned to 4n+3, where 4 indicates the chosen power of 2. The alignment of an address depends on the chosen power of 2. The same address modulo 8 is 7. An address is said to be aligned to X if its alignment is Xn+0. 这段话得仔细理解一下:Alignment是内存地址的一个属性,这个属性以把内存地址视为对2的幂进行取模运算的形式来表达。 例如,地址0x0001103F模4得3,则我们说这个地址是对齐到4n+3的,即该地址的Alignment是4n+3,其中4就是2的2次幂。内存地址的对齐属性依赖于对2的幂的选定。 同样这个地址,模8则得7,我们就说该地址的Alignment是8n+7。 结论:一个地址我们说它对齐到(Aligned to)X,如果它的Alignment是Xn+0 CPUs execute instructions that operate on data stored in memory. The data are identified by their addresses in memory. A single datum also has a size. We call a datum naturally aligned if its address is aligned to its size. It's called misaligned otherwise. For example, an 8-byte floating-point datum is naturally aligned if the address used to identify it has an 8-byte alignment. 这里又有个【自然对齐】的概念,即naturally aligned。 自然对齐说的是数据的地址对齐到这个数据的尺寸。联系上一段的结论来解释自然对齐,就是:如果一个地址的Alignment是DataSize*n+0,则该地址对齐到DataSize,且称此时为自然对齐。 注意此时2的幂的选定结果是DataSize。比如,如果一块8字节浮点数据的地址的Alignment是8*n+0,则该地址是自然对齐的。 struct x_ { char a; // 1 byte int b; // 4 bytes short c; // 2 bytes char d; // 1 byte } bar[3]; // Shows the actual memory layout struct x_ { char a; // 1 byte char _pad0[3]; // padding to put 'b' on 4-byte boundary int b; // 4 bytes short c; // 2 bytes char d; // 1 byte char _pad1[1]; // padding to make sizeof(x_) multiple of 4 } bar[3]; 这两种声明的sizeof(x_)都是12. 第一种声明会被编译器默认加入pad后变为第二种声明的布局。 编译器默认进行的调整,其宗旨就是要保证数据成员的自然对齐。比如第一种声明里的int b要保证它是自然对齐的,则其前面的字节数至少是模4得0,当然模8得0也能保证int b是自然对齐的,但编译器可能还要考虑占用内存更小的优化策略,因此最后是在char a的后面塞入3个char。而最后塞的一个字节,则是要使得x_结构整体的字节数要是4的倍数。这么做的理由呢?当然还是追求自然对齐,此时是追求struct x_整体的自然对齐,在塞最后这个char之前,x_整体的size是11,要其自然对齐,最精简的方案就是使其size变为12,即对齐到12*n+0。但是上面的理论说了,模数要是2的幂,12不是,因此,这里如果要追求x_的自然对齐,理论上应该凑成16个字节。但实践中退一步,追求4字节对齐就不错了,为什么是4呢?我认为是要将x_的尺寸凑成成员中最长的对齐字节数的倍数,即如果x_里面有8字节double类型,则x_应该凑成8字节的倍数。那这里为什么不追求2字节的倍数呢?我想如果是4字节或8字节的倍数,它自然也是2字节的倍数,但如果x_尺寸仅仅只是2字节倍数的话,并不能保证x_里面的int成员能达到自然对齐,即它的4字节对齐。比如这里定义的bar[3],如果bar[0]字节数仅仅是2的倍数,它并不能保证bar[1]里的所有int成员都能自然对齐。这个例子或许还不明显,下面这个定义应该能揭示这一点: struct x_ { char a; // 1 byte int b; // 4 bytes char c;// 1byte }; 编译器给它凑成了下面这种布局: struct x_ { char a; // 1 byte char _pad0[3]; // 3 bytes int b; // 4 bytes char c;// 1 byte char _pad1[3] }; 如果只是将x_尺寸凑成2字节的倍数,最后只需要塞1个char就够了,凑成10个字节。但如此一来,对struct x_ bar[3]而言,bar[1]里的int型就不能做到自然对齐了,因为它前面的字节数凑不成4的倍数了。 下面的定义进一步的验证了我的想法: struct m_ { char a; // 1 byte double b; // 8 bytes char c; // 1 byte }; 编译器在a后面塞了7个char(追求b的自然对齐),在c后面也塞了7个char(追求m_结构体的尺寸是成员里最长对齐字节的最小倍数,即这里8的倍数)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册