在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    3115

    瀏覽量

    75065
  • 代碼
    +關注

    關注

    30

    文章

    4891

    瀏覽量

    70365
  • Rust
    +關注

    關注

    1

    文章

    233

    瀏覽量

    6990

原文標題:CRust學習筆記:聲明宏-3

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    【RT-Thread學習筆記】一種C語言定義的寫法

    【RT-Thread學習筆記】一種C語言定義的寫法
    的頭像 發表于 07-30 13:41 ?2637次閱讀
    【RT-Thread<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>】一種C語言<b class='flag-5'>宏</b>定義的寫法

    Linux內核學習筆記:initcall

    寫過Linux驅動的人都知道`module_init`,因為它聲明了一個驅動的入口函數。
    發表于 06-01 15:12 ?775次閱讀

    英飛凌TC3XX系列多核MCU學習筆記(1)

    聲明:本文是在學習英飛凌 TC3XX系列多核 MCU 過程中整理的筆記,便于后期復習!
    發表于 09-19 09:54 ?3553次閱讀
    英飛凌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

    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 ?83次下載
    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. s
    發表于 11-01 16:25 ?8次下載
    MCU<b class='flag-5'>學習</b><b class='flag-5'>筆記</b>_C語言基礎

    學習筆記】單片機匯編學習

    學習筆記】單片機匯編學習
    發表于 11-14 18:21 ?15次下載
    【<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 ?1099次閱讀

    CRust學習筆記:生命周期-2

    本系列文章是Jon Gjengset發布的CRust of Rust系列視頻的學習筆記CRust of Rust是一系列持續更新的Rust中級教程。
    的頭像 發表于 12-19 09:34 ?1193次閱讀

    CRust學習筆記:智能指針和內部可變性

    本系列文章是Jon Gjengset發布的CRust of Rust系列視頻的學習筆記CRust of Rust是一系列持續更新的Rust中級教程。
    的頭像 發表于 01-29 14:58 ?990次閱讀

    Sentaurus TCAD學習筆記

    半導體仿真Sentaurus TCAD 學習筆記,僅供學習
    發表于 08-07 14:54 ?6次下載

    Allegro學習筆記.zip

    Allegro學習筆記
    發表于 12-30 09:19 ?7次下載
    主站蜘蛛池模板: 男人不识本网站上遍色站也枉然 | 久久婷婷成人综合色 | 亚洲春色www | 天天摸天天操免费播放小视频 | 色猫av| 特污兔午夜影院 | 2018国产一级天天弄 | 无遮挡很爽很污很黄很色的网站 | 激情九月 | 亚洲视频入口 | 777色狠狠一区二区三区香蕉 | 色视频免费国产观看 | 欧美成网 | 天天爽天天色 | 国产精品爱啪在线线免费观看 | 国产好深好硬好爽我还要视频 | 你懂的免费在线视频 | free性日韩 | 婷婷色人阁 | 农村妇女高清毛片一级 | av在线色| 日本不卡一区二区三区在线观看 | 日本综合视频 | 免费特黄一区二区三区视频一 | 77788色淫网站免费观看 | 麻豆国产一区二区在线观看 | 四虎在线最新地址4hu | 国产精品欧美一区二区三区 | 天天摸天天做 | 美女免费毛片 | 国产精品乱码高清在线观看 | 99色视频在线 | 四虎在线观看免费永久 | xxxx日本xx | 操女人免费视频 | 婷婷草 | 国产亚洲欧洲人人网 | 夜夜网站| 亚洲视频免费一区 | 理论在线看 | 人人射人人插 |