rust内存优化

背景

在 Rust 中,repr 是一个属性(attribute),用于指定数据类型在内存中的布局和表现形式
repr 属性可以用于枚举、结构体和联合体的定义,以控制它们的内部表示方式
repr 属性有多个选项,每个选项对应于一种不同的布局方式

常见的选项包括:

  • C
    将类型按照 C 语言的规则进行布局和对齐。默认的 repr 属性选项。
  • transparent
    将新类型(Newtype)与其内部类型具有相同的内存布局,没有额外的内存开销
  • usize、u8、u16、u32、u64、u128
    指定整数类型的具体大小和表示形式
  • packed
    无对齐的紧密压缩布局,没有填充字节
  • align(n)
    指定对齐方式为 n 字节对齐,其中 n 是 2 的次幂
#[repr(C)]
struct MyStruct {// 结构体字段
}#[repr(transparent)]
struct Newtype(i32);#[repr(packed)]
struct PackedStruct {// 结构体字段
}enum MyEnum {Variant1,#[repr(u8)]Variant2(u8),
}union MyUnion {field1: u8,field2: u32,
}

使用不同的 repr 属性选项,来指定不同类型的布局和表示形式
结构体 MyStruct 使用了默认的 C 表示方式
新类型 Newtype 使用了 transparent 表示方式
结构体 PackedStruct 使用了 packed 表示方式
枚举 MyEnum 的 Variant2 使用了 u8 表示方式
联合体 MyUnion 没有指定具体的 repr 属性

通过使用 repr 属性,可以控制数据类型在内存中的布局方式,
这对于与外部代码的交互、内存对齐、硬件访问等场景非常有用
需要谨慎使用 repr 属性,并根据具体的需求选择适当的选项
了解 Rust 的表示属性可以更好地控制数据的内存布局和对齐方式

将新类型(Newtype)与其内部类型具有相同的内存布局?

希望定义一个新类型来提供更好的类型安全性/表示特定的语义,但又不想引入额外的内存开销
通过使用 #[repr(transparent)] 属性,确保新类型与其内部类型的内存布局完全相同
即没有任何额外的包装或填充字节
对于在代码中传递特定类型的参数、避免不必要的包装和解包以及与其它代码进行互操作性非常有用

#[repr(transparent)]
struct Newtype(i32);

Newtype 的新类型,内部包含了一个 i32 类型的字段
告诉编译器新类型 Newtype 的大小和对齐方式与 i32 完全相同

注意
#[repr(transparent)] 属性只适用于具有单个字段的新类型
且该字段的类型和新类型的类型必须是安全的(即无内部可变性和其他危险的属性)

介绍

对于不带标记的数据结构,默认 repr
repr 代表 rust 可以任意优化内存布局,对内部数据进行重排
保证其内部空间尽量紧凑,不包含过多的 padding

struct Rust {
#![feature(offset_of)]use std::mem;struct Rust {a: u64,b: bool,c: u64,d: bool,
}fn main() {dbg!(mem::size_of::<Rust>());dbg!(mem::offset_of!(Rust, a));dbg!(mem::offset_of!(Rust, b));dbg!(mem::offset_of!(Rust, c));dbg!(mem::offset_of!(Rust, d));
}

在不带 repr© 时,rust 会对其中的 field 进行重排

[src/main.rs:13] mem::size_of::<Rust>() = 24
[src/main.rs:14] mem::offset_of!(Rust, a) = 

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

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

相关文章

3D人脸扫描设备助力企业家数字人复刻,打破商业边界

京都薇薇推出数字人VN&#xff0c;以京都薇薇董事长为原型制作&#xff0c;赋能品牌直播、短片宣传、线上面诊等活动&#xff0c;进一步增强消费者对品牌的交互体验&#xff0c;把元宇宙与品牌相融合&#xff0c;推动品牌线上服务与线下服务实现数字一体化&#xff0c;打造一个…

「X」Embedding in NLP|一文读懂 2023 年最流行的 20 个 NLP 模型

在上一篇文章中&#xff0c;我们已经科普了什么是自然语言处理&#xff08;NLP&#xff09;、常见用例及其与向量数据库的结合。今天&#xff0c;依然是「X」Embedding in NLP 系列专题&#xff0c;本文为初阶第二篇&#xff0c;我们将深入介绍在 2023 年爆火的大语言模型 NLP …

小白也看的懂的爬取视频操作

1.获取一段视频 可以直接从抖音下&#xff0c;也可以从b站上爬取&#xff08;注意法律谢谢&#xff09; 保护原创 b站的视频 直接复制网址链接到哔哩哔哩(bilibili)视频解析下载 - 保存B站视频到手机、电脑 去就好了&#xff0c;

Docker的入门

Docker的入门 防火墙Docker的命令镜像相关的命令运行容器容器相关的命令 Docker作为一个软件集装箱化平台&#xff0c;可以让开发者构建应用程序时&#xff0c;将它与其依赖环境一起打包到一个容器中&#xff0c;然后很容易地发布和应用到任意平台中。 docker有3大核心&#xf…

如何弱化市场大环境带来的影响?私域电商和裂变营销引来新趋势!

弱化市场大环境带来的影响需要从多个方面入手&#xff0c;包括深入了解市场和行业、建立品牌优势、多元化经营、优化供应链管理、加强客户关系管理、灵活应对市场变化等。同时需要注意不同领域和行业的市场变化和政策调整&#xff0c;及时调整经营策略和业务结构&#xff0c;保…

WPF实战项目十七(客户端):数据等待加载弹框动画

1、在Common文件夹下新建文件夹Events,新建扩展类UpdateLoadingEvent public class UpdateModel {public bool IsOpen { get; set; }}internal class UpdateLoadingEvent : PubSubEvent<UpdateModel>{} 2、新建一个静态扩展类DialogExtensions来编写注册和推送等待消息…

获取ip属地(ip2region本地离线包-超简单)

背景 最近有涉及要显示ip属地&#xff0c;但我想白嫖&#xff0c;结果就是白嫖的api接口太慢了&#xff0c;要延迟3到4秒左右&#xff0c;很影响体验&#xff0c;而且不一定稳定。 结果突然看到了这个【ip2region】开源项目&#xff0c;离线识别ip属地&#xff0c;精度自己测…

Public Key Retrieval is not allowed

出现这个错误的原因可能是 MySQL 连接配置中的某些设置限制了公钥的检索。要解决这个问题&#xff0c;可以尝试以下方法&#xff1a; 设置参数&#xff1a;在 MySQL 连接 URL 或连接配置中添加参数 ​allowPublicKeyRetrievaltrue​。 更新 MySQL 驱动程序&#xff1a;如果您使…

编译安装报错:configure: error: cannot guess build type; you must specify one

1、编译安装报错 configure: error: cannot guess build type; you must specify one 该报错信息翻过过来的意思是&#xff1a;无法猜测编译 操作系统类型,请指定一个 2、解决方法 在原本的编译安装语句后面加上一句&#xff1a; “--buildarm-linux ” &#xff0c;这句话…

详解开源数据库审计平台Yearning

基本概念 数据库审计&#xff08;简称DBAudit&#xff09;能够实时记录网络上的数据库活动&#xff0c;对数据库操作进行细粒度审计的合规性管理&#xff0c;对数据库遭受到的风险行为进行告警&#xff0c;对攻击行为进行阻断。它通过对用户访问数据库行为的记录、分析和汇报&…

无人智能货柜:提升购物体验

无人智能货柜&#xff1a;提升购物体验 随着移动支付的普及&#xff0c;人们日常生活中的主要场景已经渗透了这一支付方式。同时&#xff0c;无人智能货柜作为购物的重要渠道&#xff0c;正在崭露头角。通过人工智能、图像识别和物联网技术的应用&#xff0c;无人智能货柜将使购…

什么是复费率电表?

随着科技的不断进步和人们对能源管理的日益重视&#xff0c;复费率电表逐渐成为我国电力系统中不可或缺的一员。复费率电表是一种能够实现电能计量、峰谷电价划分以及负荷控制等多功能的智能电表&#xff0c;它采用先进的通信技术和计算机算法&#xff0c;对用户的用电行为进行…

nginx.conf 配置文件 详细解释

文章目录 nginx.conf 是 Nginx 的主要配置文件&#xff0c;其中可以配置许多模块来定义服务器行为。以下是一些常见的 Nginx 模块以及它们的作用&#xff1a;1. **http 模块**&#xff1a;2. **server 模块**&#xff1a;3. **location 模块**&#xff1a;4. **events 模块**&a…

软件系统测试有哪些测试流程?系统测试报告编写注意事项

在软件开发的过程中&#xff0c;系统测试是至关重要的一环&#xff0c;它的目的是验证和评估软件产品是否符合预期的质量标准&#xff0c;以确保系统的稳定性、可靠性和安全性。 一、软件系统测试的测试流程 1、需求分析与测试计划制定&#xff1a;根据需求分析确定测试目标、…

软件开发及交付的项目管理角色

在软件开发及交付过程中&#xff0c;通常会涉及不同的角色和职责&#xff0c;包括业务角色、技术角色和管理角色。这些角色在项目管理中发挥着不同的作用&#xff0c;以确保项目的成功和交付高质量的产品。 业务角色&#xff1a;包括产品经理、业务分析师和业务运营人员等职位…

外贸电商网站用什么服务器好?

外贸电商网站用什么服务器好&#xff1f; 电商网站选好域名后&#xff0c;接着就是为网站选择一个好的网站服务器&#xff0c;截止2015年初&#xff0c;国内站长中约有三百多万的网站存放在美国服务器&#xff0c;美国服务器为什么会有如此之多的用户选择使用呢&#xff0c;站…

张弛声音变现课,青春剧配音实用攻略

在为青春剧添声时&#xff0c;配音艺术家须要捕获并传达剧中年轻角色的活泼精神、成长道路上的激情&#xff0c;以及他们在面对友情、爱情和理想时的情绪起伏。青春剧特别关注年轻人的成长故事&#xff0c;着重描绘他们在成长中的经历和变化。下面是一些为青春剧配音的建议&…

TP5制作图片压缩包

目标:将多张图片制成在一个压缩包内,供调取使用 public function test() {//引入压缩包类$zip new \ZipArchive();//新定义一个zip包$zipname ROOT_PATH./public/zip/.date("YmdHis").rand(111,999)..zip;if ($zip->open($zipname, \ZipArchive::CREATE) true…

2023年跨界融合创新应用合作发展大会-核心PPT资料下载

一、峰会简介 本次大会主题为“创新地理信息价值 服务数字中国建设”。1天主论坛和6场专题论坛的报告&#xff0c;围绕主题深入探讨地理信息产业与相关重要应用领域的跨界融合和深化合作。 本届大会将搭建地理信息产业与旅游、林业、环保、气象、住建、水利、农业农村、电力等…

数据报文去哪儿了

背景 今天遇到一个诡异的现象&#xff0c;当接口附加一个IP时&#xff0c;主IP业务正常&#xff0c;附加IP死活不行&#xff0c;tcpdump抓包确可以正常抓到到业务的报文&#xff0c;但是在PREROUTING raw添加规则确没有命中&#xff0c;说明报文没有到netfilter框架内&#xff…