0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CRust学习笔记:声明宏

jf_wN0SrCdH 来源:coding到灯火阑珊 作者:李明 2023-01-06 14:37 次阅读

本系列文章是Jon Gjengset发布的CRust of Rust系列视频的学习笔记,CRust of Rust是一系列持续更新的Rust中级教程

在这篇文章中,我们将接着上一篇文章对avec!宏做性能优化。

先看一下已经写好的代码:

 1#[macro_export]
 2macro_rules!avec{
 3......
 4($element:expr;$count:expr)=>{{
 5letmutvs=Vec::new();
 6letx=$element;
 7for_in0..$count{
 8vs.push(x.clone());
 9}
10vs
11}};
12}

在第5行,我们创建了一个空的Vector,然后在第8行进行了一堆的push操作。

假设我们有1024个元素要放入到Vector中,那就进行了1024次push操作,就会导致在堆内存上对Vector进行多次重新分配。这是因为在 vector 增加新元素时,如果没有足够的空间就会要求分配大小是原内存2倍的新内存,并将老的元素拷贝到新的空间中,再销毁旧内存中的数据。

第一个需要改进的地方是:将创建空Vector的语法Vec::new()改成Vec::with_capacity(count),根据count大小预先分配内存空间,这样就避免了一堆的内存重新分配操作。

 1#[macro_export]
 2macro_rules!avec{
 3......
 4($element:expr;$count:expr)=>{{
 5letcount=$count;
 6letmutvs=Vec::with_capacity(count);
 7letx=$element;
 8for_in0..count{
 9vs.push(x.clone());
10}
11vs
12}};
13}
第二个需要改进的地方是push,尽管已经预先分配了内存空间,但是每次执行push操作后,指向元素的指针地址都会增长,都会进行边界检查,这是不需要的。修改如下:
 1#[macro_export]
 2macro_rules!avec{
 3......
 4($element:expr;$count:expr)=>{{
 5letcount=$count;
 6letmutvs=Vec::with_capacity(count);
 7vs.extend(std::repeat($element).take(count));
 8vs
 9}};
10}

我们使用Vector的extend方法,参数需要一个iterator,我们使用了标准库的std::repeat函数,它会把element元素进行clone。使用extend方法的好处是只会对iterator的范围进行一次边界检查,这样就更加高效。

我们也可以使用Vector的resize方法:

 1#[macro_export]
 2macro_rules!avec{
 3......
 4($element:expr;$count:expr)=>{{
 5//letcount=$count;
 6//letmutvs=Vec::with_capacity(count);
 7//vs.extend(std::repeat($element).take(count));
 8letmutvs=Vec::new();
 9vs.resize($count,$element);
10vs
11}};
12}
至此,关于Rust的声明宏就学习完了。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2772

    浏览量

    72827
  • 代码
    +关注

    关注

    30

    文章

    4558

    浏览量

    66928
  • Rust
    +关注

    关注

    1

    文章

    224

    浏览量

    6400

原文标题:CRust学习笔记:声明宏-3

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    英飞凌TC3XX系列多核MCU学习笔记(1)

    声明:本文是在学习英飞凌 TC3XX系列多核 MCU 过程中整理的笔记,便于后期复习!
    发表于 09-19 09:54 1313次阅读
    英飞凌TC3XX系列多核MCU<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(1)

    请问关于C6000系列库中DISABLE ,DEFAULT这样的是在哪个头文件里声明的?

    看到历程中有很多定义,但是没有找到是在哪个头文件中声明的,请问如DISABLE ,DEFAULT这样的是在哪个头文件里声明的??
    发表于 07-25 07:18

    MCU学习笔记相关资料分享

    MCU学习笔记C语言基础1. 位操作2. define定义关键词3. ifdef /ifndef 条件编译4. extern变量声明5. typedef 类型别名6. 结构体7. s
    发表于 11-04 07:10

    PADS_2007学习笔记

    PADS_2007学习笔记
    发表于 01-16 13:54 18次下载

    Ansoft学习笔记

    ansoft学习笔记与常见问题
    发表于 03-23 10:24 0次下载

    Java设计模式学习笔记

    Java设计模式学习笔记
    发表于 09-08 10:15 5次下载
    Java设计模式<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    ARM学习笔记

    ARM学习笔记
    发表于 10-13 14:28 3次下载
    ARM<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    Altera FPGA CPLD学习笔记

    Altera FPGA CPLD学习笔记(肇庆理士电源技术有限)-Altera FPGA CPLD学习笔记                 
    发表于 09-18 10:54 79次下载
    Altera FPGA CPLD<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    MCU学习笔记_C语言基础

    MCU学习笔记C语言基础1. 位操作2. define宏定义关键词3. ifdef /ifndef 条件编译4. extern变量声明5. typedef 类型别名6. 结构体7. static
    发表于 11-01 16:25 8次下载
    MCU<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>_C语言基础

    学习笔记】单片机汇编学习

    学习笔记】单片机汇编学习
    发表于 11-14 18:21 12次下载
    【<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】单片机汇编<b class='flag-5'>学习</b>

    CRust学习笔记:生命周期-1

    本系列文章是Jon Gjengset发布的CRust of Rust系列视频的学习笔记CRust of Rust是一系列持续更新的Rust中级教程。
    的头像 发表于 12-19 09:33 572次阅读

    CRust学习笔记:生命周期-2

    本系列文章是Jon Gjengset发布的CRust of Rust系列视频的学习笔记CRust of Rust是一系列持续更新的Rust中级教程。
    的头像 发表于 12-19 09:34 574次阅读

    CRust学习笔记:智能指针和内部可变性

    本系列文章是Jon Gjengset发布的CRust of Rust系列视频的学习笔记CRust of Rust是一系列持续更新的Rust中级教程。
    的头像 发表于 01-29 14:58 567次阅读

    Sentaurus TCAD学习笔记

    半导体仿真Sentaurus TCAD 学习笔记,仅供学习
    发表于 08-07 14:54 4次下载

    Allegro学习笔记.zip

    Allegro学习笔记
    发表于 12-30 09:19 6次下载