<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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

    文章

    2767

    瀏覽量

    72779
  • 代碼
    +關注

    關注

    30

    文章

    4557

    瀏覽量

    66826
  • Rust
    +關注

    關注

    1

    文章

    223

    瀏覽量

    6388

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

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

收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

    Sentaurus TCAD學習筆記

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

    Allegro學習筆記.zip

    Allegro學習筆記
    發表于 12-30 09:19 ?6次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>