深入浅出rust内存对齐

在 Rust 中,内存对齐是一个重要的概念,它涉及到数据在内存中的存储方式,以及如何优化内存访问的效率。往往一门语言的内存布局以及对齐方式决定了一门语言的性能,因此学会并深入理解rust中内存布局会让我们写出高性能的rust代码,我们就从以下介个方面来对rust的内存对齐:

1. **内存对齐的定义**:
   - 内存对齐要求数据在内存中的存储位置满足特定的对齐要求。大多数计算机体系结构要求某些数据类型的地址必须是特定大小的整数倍 。

2. **对齐的自然数倍**:
   - `address` 与 `size` 都必须是对齐位数 `alignment` 的自然数倍。例如,对齐位数为 2 字节的变量值仅能保存于偶数位的内存地址上 。

3. **对齐位数**:
   - 对齐位数 `alignment` 必须是 2 的自然数次幂,即 `alignment = 2^N` 且 `N` 是小于或等于 29 的自然数 。

4. **存储宽度**:
   - 存储宽度 `size` 是有效数据长度加上对齐填充位数的总和字节数 。

5. **对齐填充**:
   - 由于 `address`、`size` 与 `alignment` 之间存在倍数关系,程序对内存空间的利用会出现冗余与浪费,这些被浪费掉的部分被称为对齐填充 `alignment padding` 。

6. **小端和大端填充**:
   - 对齐填充分为小端填充 `Little-Endian padding` 和大端填充 `Big-Endian padding`,分别对应 0 填充位出现在有效数据右侧的低位和左侧的高位 。

7. **默认对齐规则**:
   - Rust 中,默认情况下,数据类型的对齐方式是与其大小相对应的。例如,`u32`、`i32`、`f32` 和指针类型对齐到 4 字节边界;`u64`、`i64` 和 `f64` 类型对齐到 8 字节边界 。

8. **手动控制对齐**:
   - 可以通过 `#[repr(align(n))]` 注解来手动控制结构体或枚举的对齐方式 。

9. **紧凑对齐**:
   - 通过 `#[repr(packed)]` 属性可以手动设置紧凑对齐方式,这会忽略默认的对齐规则,使结构体占用更少的空间 。

10. **内存对齐的影响**:
    - 内存对齐是编译器或虚拟机(比如 JVM)的工作,不需要人为指定,但是作为开发者需要了解内存对齐的规则,这有助于编写出合理利用内存的高性能程序 。

这些规则和特性确保了 Rust 程序在不同平台上的内存访问效率和兼容性。通过理解内存对齐,开发者可以更好地优化程序性能和内存使用。
# 例子
在 Rust 中,你可以使用 `#[repr(align(n))]` 属性来指定结构体或枚举的对齐要求。以下是一些关于内存对齐的例子:

### 默认对齐

```rust
#[repr(C)]
struct AlignedStruct {
    a: u8,
    b: u32,
    c: u64,
}

fn main() {
    println!("Size of AlignedStruct: {}", std::mem::size_of::<AlignedStruct>());
    println!("Align of AlignedStruct: {}", std::mem::align_of::<AlignedStruct>());
}
```

在这个例子中,`AlignedStruct` 使用默认对齐,`u8`、`u32` 和 `u64` 会根据它们的大小自然对齐。`u8` 不需要对齐,`u32` 需要 4 字节对齐,`u64` 需要 8 字节对齐。因此,`AlignedStruct` 的对齐要求将由最大的对齐要求决定,即 8 字节。

### 手动指定对齐

```rust
#[repr(align(4))]
struct ManuallyAligned {
    a: u8,
    b: u32,
    c: u64,
}

fn main() {
    println!("Size of ManuallyAligned: {}", std::mem::size_of::<ManuallyAligned>());
    println!("Align of ManuallyAligned: {}", std::mem::align_of::<ManuallyAligned>());
}
```

在这个例子中,我们手动将 `ManuallyAligned` 的对齐要求设置为 4 字节。这意味着结构体在内存中的地址必须是 4 的倍数。这可能会导致一些填充,以确保 `u64` 成员 `c` 也符合这个对齐要求。

### 紧凑对齐

```rust
#[repr(packed)]
struct PackedStruct {
    a: u8,
    b: u32,
    c: u64,
}

fn main() {
    println!("Size of PackedStruct: {}", std::mem::size_of::<PackedStruct>());
    println!("Align of PackedStruct: {}", std::mem::align_of::<PackedStruct>());
}
```

在这个例子中,`PackedStruct` 使用 `#[repr(packed)]` 属性,这意味着结构体将尽可能紧凑地排列,忽略默认的对齐规则。这可能会导致内存访问效率降低,但可以节省空间。

### 对齐填充

```rust
#[repr(C, align(8))]
struct AlignedWithPadding {
    a: u8,
    b: u32,
}

fn main() {
    let aligned_with_padding = AlignedWithPadding { a: 1, b: 2 };
    unsafe {
        println!("Address of a: {}", aligned_with_padding as *const _ as usize);
        println!("Address of b: {}", &aligned_with_padding.b as *const _ as usize);
    }
}
```

在这个例子中,`AlignedWithPadding` 被指定为 8 字节对齐。由于 `a` 是 `u8` 类型,它后面会有 3 字节的填充,以确保 `b` 是 8 字节对齐的。我们使用 `unsafe` 代码来打印出 `a` 和 `b` 的地址,以展示对齐的效果。

请注意,手动控制对齐和紧凑对齐可能会影响程序的性能和跨平台兼容性,因此应谨慎使用。在大多数情况下,依赖 Rust 的默认对齐策略是最佳实践。、

如果我的文章对您有所帮助,还请一键三连我的小绿书,从此不迷路,您的一键三连是对我最大的鼓励和支持,因为有您的鼓励和支持让我一路坚持输出,万分感谢您的鼓励和支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的起源与发展

一、C的起源与初期发展 C的起源可以追溯到1979年&#xff0c;当时丹麦计算机科学家比雅尼斯特劳斯特鲁普&#xff08;Bjarne Stroustrup&#xff09;在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务&#xff0c;特别是模拟和操作系统的开发工作…

SDL渲染器和纹理

文章目录 渲染器 (SDL_Renderer)纹理 (SDL_Texture)代码 渲染器 (SDL_Renderer) &#xff1a;它是渲染内容的接口&#xff0c;负责将内容绘制到窗口中。通过SDL_CreateRenderer创建&#xff0c;可以设置渲染器的背景颜色、绘图颜色、透明度等。所有绘图操作&#xff08;如绘制…

题目练习之二叉树那些事儿(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

go语言 分布式一致

flowchart TDStart([接收 key]) --> CheckCache{检查是否被缓存}CheckCache -->|是| ReturnCache1[返回缓存值 ⑴]CheckCache -->|否| CheckRemote{是否应当从远程节点获取}CheckRemote -->|是| HashSelect[使用一致性哈希选择节点]HashSelect --> IsRemote{是否…

【STL栈和队列】:高效数据结构的应用秘籍

前言&#xff1a; C 标准模板库&#xff08;STL&#xff09;为我们提供了多种容器&#xff0c;其中 stack&#xff08;栈&#xff09;和 queue&#xff08;队列&#xff09;是非常常用的两种容器。 根据之前C语言实现的栈和队列&#xff0c;&#xff08;如有遗忘&#xff0c;…

Zabbix 7 最新版本安装 Rocky Linux 8

前言 本实验主要在Rocky Linux 中安装Zabbix&#xff0c;其他centos8、Debian、Ubuntu、Alma Linux都可以安装&#xff0c;就是在中间件有点不同。Nginx就要配置一下&#xff0c;官网给的教程也算是很规范的&#xff0c;就是在MySQL上要自己安装&#xff0c;他没有告诉我们&am…

docker里rtsp推流+同一个docker接受流进行部署

1.参考&#xff1a; https://blog.csdn.net/m0_57609406/article/details/140323327 2.dockerfile命令 # 使用官方 Python 基础镜像 FROM python:3.8.18-slim# 设置工作目录 WORKDIR /usr/src/app# 安装必要的软件包&#xff08;FFmpeg、OpenCV、lsof、RTSP工具&#xff09;…

主进程main.js打印中文时终端显示乱码解决方案

{"name": "aaa","version": "1.0.0","description": "first electron app","main": "main.js","scripts": {// 解决乱码的问题"start": "chcp 65001 && no…

git新手使用教程

git新手使用教程 一、安装和初始化配置2、新建仓库3.工作区域和文件状态4.添加和提交文件5 git reset回退版本6 使用git diff查看差异7 使用git rm删除文件8 .gitignore忽略文件9 注册GitHub账号10 SSH配置和克隆仓库11 关联本地仓库和远程仓库12 Gitee的使用 由B站视频教程整理…

【GPTs】Email Responder Pro:高效生成专业回复邮件

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Email Responder Pro主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; Email Craft 是一款专门用于…

使用yarn,如何编译打包electron?

要使用yarn编译打包Electron应用&#xff0c;可以按照以下步骤操作&#xff1a; 安装Electron Forge或Electron Builder&#xff1a; Electron Forge是一个一体化工具&#xff0c;可以处理Electron应用程序的打包与分发。可以通过yarn安装Electron Forge CLI工具包到项目的devD…

2024下半年软考系统架构师案例分析题试题与答案--ROS机器人操作系统

一、知识点回顾 ROS(Robot Operating System)是一个用于编写机器人软件的框架。它提供了一系列的工具和库,帮助开发者创建复杂的、可以在多种操作系统上运行的机器人应用程序。 ROS的主要特点包括: 分布式计算能力:ROS提供了一种方式让多个计算机或设备协同工作,通过…

uni-app表格带分页,后端处理过每页显示多少条

uni-app表格带分页&#xff0c;后端处理过每页可以显示多少条&#xff0c;一句设置好了每页显示的数据量&#xff0c;不需要钱的在进行操作&#xff0c;在进行对数据的截取 <th-table :column"column" :listData"data" :checkSort"checkSort"…

安川电源模块:YASKAWA CPS-IONB或CPS-I0NB

‌安川电源模块‌是一种直接贴装在印刷电路板上的电源供应器&#xff0c;主要用于为专用集成电路&#xff08;ASIC&#xff09;、数字信号处理器&#xff08;DSP&#xff09;、微处理器、存储器、现场可编程门阵列&#xff08;FPGA&#xff09;及其他数字或模拟负载提供供电。这…

探索Copier:Python项目模板的革命者

文章目录 **探索Copier&#xff1a;Python项目模板的革命者**1. 背景介绍&#xff1a;为何Copier成为新宠&#xff1f;2. Copier是什么&#xff1f;3. 如何安装Copier&#xff1f;4. 简单库函数使用方法4.1 创建模板4.2 从Git URL创建项目4.3 使用快捷方式4.4 动态替换文本4.5 …

密码学知识点整理二:常见的加密算法

常用的加密算法包括对称加密算法、非对称加密算法和散列算法。 对称加密算法 AES&#xff1a;高级加密标准&#xff0c;是目前使用最广泛的对称加密算法之一&#xff0c;支持多种密钥长度&#xff08;128位、192位、256位&#xff09;&#xff0c;安全性高&#xff0c;加密效率…

大模型就业收入高吗?大模型入门到精通,收藏这篇就够了

目前&#xff0c;已经可以说人工智能&#xff08;AI&#xff09;是推动社会进步和产业升级的重要力量。 其中&#xff0c;AI大模型作为人工智能领域的核心技术之一&#xff0c;正引领着新一轮的技术革命。 2024年&#xff0c;AI大模型开发工程师无疑成为了IT行业中最炙手可热…

uni-app表单⑪

文章目录 十七、用户登录-登录界面搭建一、结构样式代码编写 十八、用户登录-表单验证一、userRulesMixin 文件使用二、验证规则编写 十七、用户登录-登录界面搭建 一、结构样式代码编写 uni-forms 插件下载 下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id2773 s…

Kubebot:一款Google云平台下的Slackbot安全测试工具

Kubebot 今天给大家介绍的是一款名叫Kubebot的安全测试Slackbot&#xff0c;该工具基于Google 云平台搭建&#xff0c;并且提供了Kubernetes后端。 项目架构 数据流 1.API请求由Slackbot发起&#xff0c;发送至API服务器&#xff0c;API服务器以Kubernetes(K8s)集群中的Docke…

树莓派AI视觉小车--5.机器人小车超声波避障

通过超声波模块与小车结合&#xff0c;实现小车超声波避障。确保小车接线已安装&#xff0c;且安装正确。 通过超声波来获取小车与障碍物的距离。当检测到小车与障碍物的距离小于我们的设置的距离时&#xff0c;小车左旋避开障碍物。 运行代码如下所示&#xff1a; from LOBO…