登录/注册

字节对齐

更多

字节对齐(Byte Alignment),也称为数据对齐(Data Alignment),是计算机系统中一种重要的内存管理概念。它指的是将数据在内存中的存放地址调整为特定数值(通常是其自身大小或系统字长的整数倍)的过程

为什么要字节对齐?

主要原因与硬件效率密切相关:

  1. 硬件访问要求:
    • 许多处理器(尤其是 RISC 架构如 ARM, MIPS, SPARC 和现代 x86)被设计为只能从某些特定的对齐地址(例如 2-byte, 4-byte, 8-byte 边界)高效地读取或写入数据。
    • 例如,一个 32 位(4 字节)的整数,处理器可能要求其起始地址必须是 4 的倍数(如 0x0000, 0x0004, 0x0008, ...)。一个 64 位(8 字节)的双精度浮点数,起始地址可能需要是 8 的倍数。
  2. 性能提升:
    • 访问对齐的数据,处理器通常只需一次内存访问操作即可完成。
    • 如果数据未对齐(Misaligned),处理器可能需要进行两次内存访问操作,然后拼接出所需的数据片段。这不仅速度慢很多倍,在早期或某些嵌入式处理器上甚至会导致硬件异常(程序崩溃)。
  3. 原子性保证:
    • 某些处理器架构保证对齐数据的读写操作是原子的(即在操作完成前不会被中断)。这对于实现无锁数据结构和确保数据一致性很重要。
  4. 缓存效率:
    • 现代处理器使用高速缓存(Cache),数据传输以缓存行为单位(通常是 64 字节)。对齐的数据结构更容易完整地放入一个或多个缓存行中,减少跨缓存行访问的情况,从而提升缓存利用率和性能。

字节对齐是如何工作的?(以结构体为例)

编译器在分配内存给变量(尤其是结构体 struct 和联合体 union 的成员)时,会自动插入填充字节来确保每个成员都满足其自身的对齐要求。

例子:

struct MyStruct {
    char a;      // 1 字节
    // 编译器插入 3 个填充字节 (Padding Bytes) 以满足 int 的对齐要求
    int b;       // 4 字节,要求按 4 字节对齐(地址是 4 的倍数)
    char c;      // 1 字节
    // 编译器再插入 3 个填充字节,使整个结构体大小是最大成员大小(int: 4字节)的整数倍(为了数组连续存放)
};               // 总大小 = 1(char) + 3(padding) + 4(int) + 1(char) + 3(padding) = 12 字节

对齐值 (Alignment Requirement)

控制对齐(编译器指令)

程序员有时需要手动控制对齐,例如:

C/C++ 中常用指令或属性:

总结

字节对齐是计算机系统底层为了高效访问内存数据而采用的核心机制。虽然有时会造成一些内存空间浪费(填充字节),但它带来的性能提升是显著的。编译器通常会自动处理对齐,但理解其原理对于进行底层编程、性能优化和理解内存布局至关重要。

嵌套的结构体 字节是如何对齐

嵌套的结构体,字节又是如何对齐的呢 先来看下面的代码 typedef struct stu1 { char ary [ 5 ] ; int a; }stu1; typedef struct stu2

2023-11-20 16:01:17

什么是结构体的字节对齐现象

什么是结构体的字节对齐现象 程序员,咱都用代码说话,先上 code: (说明:以下代码均在 ARM 平台上,使用 Keil 进行编译测试) # define offset_of (TYPE

2023-11-20 15:55:04

C/C++编译器的缺省字节对齐方式

C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。

2023-04-15 11:24:42

stm32h743外部RAM非字节对齐访问,引起的hard fault

stm32h743外部RAM非字节对齐访问,引起的hard fault

资料下载 彭友旺 2021-12-09 09:21:15

单片机字节对齐

对齐原则:数据存放的地址需要是其类型长度的整数倍;字节对齐的作用不仅是便于cpu快速访问,同时合理的利用

资料下载 佚名 2021-12-01 15:21:05

STM32 终极字节对齐解析

一、全局变量对齐问题:基本上用户定义的变量是几个字节就是几字节对齐,这个

资料下载 佚名 2021-11-23 18:06:31

单片机开发重点-字节对齐问题

单片机开发重点-字节对齐问题在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:使用伪指令 #pragma pack(n),C

资料下载 佚名 2021-11-13 13:06:02

Cortex-M3 栈的8字节对齐资料下载

电子发烧友网为你提供Cortex-M3 栈的8字节对齐资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。

资料下载 孙成红 2021-04-11 08:42:12

对结构体的对齐理解上有点偏差

总结一下: 结构体对齐不再是简单的字节个数的拼凑,而是要与内存地址进行挂钩~一般我们也可以理解为内存地址分配是多少字节的倍数,就是多少直接

2022-08-10 18:08:28

【C语言进阶】面试题:请使用宏定义实现字节对齐

【C语言进阶】面试题:请使用宏定义实现字节对齐

2022-07-11 09:21:14

STM32终极字节对齐的相关资料推荐

一、全局变量对齐问题:基本上用户定义的变量是几个字节就是几字节对齐,这个

2021-12-06 06:03:19

解决单片机开发字节对齐问题的方法

单片机开发重点-字节对齐问题在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:使用伪指令 #pragma pack(n),C

2021-11-22 06:06:08

C语言中Linux字节对齐的问题

,于是经过排查,是因为传递消息的结构体没有考虑字节对齐的问题。 随手整理一下C语言中字节

2021-08-16 11:25:26

解析C语言结构体字节如何对齐

01 默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试

2021-06-12 17:42:00

align为什么要8字节对齐

我知道数据储存的起始地址%对齐字节(N)=0才行,但是我不明白有两点问题1:UCOSIII的系统中的浮点数打印任务的堆栈大小要8字节

2020-04-23 00:21:44
7天热门专题 换一换
相关标签