首页 文章 精选 留言 我的

精选列表

搜索[安全研究],共10009篇文章
优秀的个人博客,低调大师

研究字节对齐

今天花了半天好好研读了一下微软这篇文章,基本搞明白了字节对齐。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的倍数)

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册