揭开智能指针 Box 的神秘面纱
熟悉 c++ 的肯定知道 shared_ptr, unique_ptr, 而 Rust 也有智能指针 Box, Rc, Arc, RefCell 等等,本文分享 Box 底层实现
Box会在堆上分配空间,存储 T 值,并返回对应的指针。同时 Box 也实现了 trait Deref 解引用和 Drop 析构,当 Box 离开作用域时自动释放空间
入门例子
例子来自 the rust book, 为了演示方便,去掉打印语句
fn main() { let _ = Box::new(0x11223344); }
将变量 0x11223344 分配在堆上,所谓的装箱,java 同学肯定很熟悉。让我们挂载 docker, 使用 rust-gdb 查看汇编实现
Dump of&nbs揭开p;assembler code for function hello_cargo::main: 0x000055555555bdb0 <+0>: sub $0x18,%rsp 0x000055555555bdb4 <+4>: movl $0x11223344,0x14(%rsp) => 0x000055555555bdbc <+12>: mov $0x4,%esi&智能nbsp; 0x000055555555bdc1 <+17>: mov %rsi,%rdi 0x000055555555bdc4 <+20>: callq 0x55555555b5b0 <alloc::alloc::exchange_malloc> 0x000055555555bdc9 <+25>: mov %rax,%rcx 0x000055555指针555bdcc <+28>: mov %rcx,%rax 0x000055555555bdcf <+31>: movl $0x11223344,(%rcx) 0x000055555555bdd5 <+37>: mov %rax,0x8(%rsp) 0x000055555555bdda <+42>: lea 0x B8(%rsp),%rdi 0x000055555555bddf <+47>: callq 0x55555555bd20 <core::ptr::drop_in_place<alloc::boxed::Box>> 0x000055555555bde4 <+52>: add $0x18,%rsp 0x000055555555bde8 <+56>: retq End of assembler&noxbsp;dump.
关键点就两条,alloc::alloc::exchange_malloc 在堆上分配内存空间,然后将 0x11223344 存储到这个 malloc 的地址上
函数结束时,将地址传递给 core::ptr::drop_in_place 去释放,因为编译器知道类型是 alloc::boxed::Box, 会掉用 Box 相应的 drop 函数
单纯的看这个例子,Box 并不神秘,对应汇编实现,和普通指针没区别,一切约束都是编译期行为
所有权 fn main() { let x = Box::new(String::from("Rust")); let y =&nb 的sp;*x; println!("x is {}", x); }
这个例子中将字符串装箱,其实没必要这么写,因为 String 广义来讲本身就是一种智能指针。这个例子会报错
3 | let y = *x; | -- value moved here 4 | &n神秘bsp;println!("x is {}", x); | ^ value borrowed here after move
*x 解引用后对应 String, 赋值给 y 时执行 move 语义,所有权不在了,所以后续 println 不能打印 x
let y = &*x;
可以取字符串的不可面纱变引用来 fix
底层实现 pub struct Box< T: ?Sized, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global, >(Unique, A);
上面是 Box 的定义,可以看到是一个元组结构体,有两个泛型参数:T 代表任意类型,A 代表内存分配器。标准库里 A 是 Gloal 默认值。其中 T 有一个泛型约束 ?Sized, 表示在编译时可能知道类型大小,也可能不知道,当然一般都用于揭开不知道大小的场景,很少像上文一样存储 int
#[stable(feature = "rust1", since = "1.0.0")] unsafe impl<#[may_dangle] T: ?Sized, A: Allocator> Drop for Box<T, A> { fn drop(&mut self) { // FIX智能ME: Do nothing, drop is currently performed by compiler. } }
这是 Drop 实现,源码里也说了,由编译器实现
#[stable(feature = "rust1", since = "1.0.0")] impl Deref for Box<T, A> { type Target = T; &nbs指针p; fn deref(&self) -> &T { &**self } } #[stable(feature = "rust1", since = "1.0.0")] impl DerefMut for Box<T, A> { fn d Beref_mut(&mut self) -> &mut T { &mut **self } }
实现了 Deref 可以定义解引用行为,DerefMut 可变解引用。所以 *x 对应着操作 *(x.deref())
适用场景
官网提到以下三个场景,本质上 Box 和普通指针区别不大,所以用处不如 Rc, Arc, RefCell 广
当类型在编译期不知道大小,但代码场景还要求确认类型大小的时候 当你有大量数据,需要移动所有权,而不想 copy 数据的时候 trait 对象,或者称为 dyn 动态分发常用在ox一个集合中存储不同的类型上,或者参数指定不同的类型
官网有一个链表的实现
enum List { Cons(i32, List), Nil, }
上面代码是无法运行的,道理也很简单,这是一种递归定义。对应 c 代码也是不行的,我们一般要给 next 类型定义成指针才行
enum List { Cons(i32, Box), Nil, } use crate::List::{Cons,& 的nbsp;Nil}; fn main() { let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil)))))); }
官网给的解决方案,就是将 next 变成了指针 Box , 算是常识吧,没什么好说的
(责任编辑:产品升级)
-
Twitter前高管打造AI开发工具Macroscope 挑战传统开发模式
继成功将直播视频初创公司Periscope出售给Twitter后,Twitter前产品负责人Kayvon Beykpour带着新的AI创业项目强势回归。周三,Beykpour宣布推出Macroscop...[详细]
-
尽管云计算技术已经推出十多年的时间,但企业从私有云、内部部署或公共云环境中管理其当前迭代的工具仍在快速发展。调研机构Gartner公司表示,全球90多家云计算供应商提供了不同的云计算管理功能,其中包括...[详细]
-
全面开源的 LLaVA-OneVision-1.5,超越 Qwen2.5-VL 的多模态模型登场
近日,开源社区迎来了 LLaVA-OneVision-1.5,这是一款全新的多模态模型,标志着技术的一次重大进步。LLaVA(大型语言与视觉助手)系列历经两年开发,逐步从简单的图文对齐模型演变为能够处...[详细]
-
在近日举行的 2025 云栖大会上,网易宣布了一项激动人心的技术创新:公司已成功接入了通义千问(Qwen)AI 系统,利用这一先进技术,网易的游戏开发效率提升了惊人的 50%。这一举措不仅显示了网易在...[详细]
-
GPT-5 Pro找回被遗忘的数学答案:埃尔德什问题#339早在2003年已被证明
一道被认为悬而未决的数学难题,竟然在22年前就已经有了答案。近日,OpenAI的最新AI模型GPT-5Pro通过一张问题截图,成功定位到了埃尔德什问题#339在2003年就已发表的证明论文,这一发现让...[详细]
-
云安全日报210412:Debian Web应用程序发现目录遍历漏洞,需要尽快升级
python-django是一个功能强大开放源代码的重量级Web应用框架。4月9日,Debian发布了安全更新,修复了python-django中发现的目录遍历漏洞。以下是漏洞详情: 漏洞详情 来源:...[详细]
-
新浪科技讯 北京时间4月22日早间消息,据报道,美国得克萨斯州的一个联邦陪审裁决,英特尔公司并未侵犯恩智浦半导体之前拥有的有关电脑加速方法的专利,陪审团不支持恩智浦对英特尔的侵权指控,英特尔避免了又一...[详细]
-
云梦级2月10日云梦级消息,2月10日,豆包宣布“豆包过年”新春活动正式开启,活动期间将为用户发放新春红包。此外,除夕夜的中央广播电视总台2026年春晚期间,豆包还将为全国观众送出超过10万份接入豆包...[详细]
-
新浪科技讯 北京时间3月2日消息,周二美国白宫表示,Facebook举报人弗朗西丝·豪根(Frances Hauge)计划在周二晚间出席美国总统拜登在国会的首次国情咨文演讲,她的出席旨在强调年轻人面临...[详细]
-
替换 Spring Cloud,使用基于 Cloud Native 的服务治理
Spring Cloud 技术体系简介 我们通过时间线展开整个项目背景: 在我刚开始工作的时候(2010 年以前),可能还没有云原生社区,当时 Java 体系是企业级开发的首选。 2010 年, Ne...[详细]
- https://www.lauben.com/en/?action=SEARCH&s=谷歌自动批量发帖软件【tg:seogoogle987】,DUF
- https://www.otakuninjahero.com/en/search/谷歌自动批量发帖软件【tg:seogoogle987】,CiT
- https://www.lyrics.com/lyrics/谷歌自动批量发帖软件【tg:seogoogle987】,NUB
- https://www.wattpad.com/search/谷歌自动批量发帖软件【tg:seogoogle987】rM5
- https://www.teacherspayteachers.com/Browse/Search:谷歌自动批量发帖软件【tg:seogoogle987】,tgY
- https://www.nyif.com/catalogsearch/result/?q=谷歌自动批量发帖软件【tg:seogoogle987】,ckG
- https://www.pixiv.net/tags/谷歌自动批量发帖软件【tg:seogoogle987】,4rk
- https://www.teamlab.art/?submit=谷歌自动批量发帖软件【tg:seogoogle987】,Qna
- https://www.kuaikanmanhua.com/sou/谷歌自动批量发帖软件【tg:seogoogle987】,An5
- https://www.roblox.com/discover/?cat=107&Keyword=谷歌自动批量发帖软件【tg:seogoogle987】,ubg

标签: 鹿客科技 智能锁 静脉锁 百度
标签: 携程 搜索 MC Beam
标签: 刘宇 Vivix AI 商汤 秒画
亚马逊任命云计算业务新CEO 原一把手贾西接班贝索斯
标签: SpaceX xAI 马斯克 星舰
