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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CRust學(xué)習(xí)筆記:聲明宏

jf_wN0SrCdH ? 來(lái)源:coding到燈火闌珊 ? 作者:李明 ? 2023-01-06 14:37 ? 次閱讀

本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記,CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程

在這篇文章中,我們將接著上一篇文章對(duì)avec!宏做性能優(yōu)化。

先看一下已經(jīng)寫好的代碼:

 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行,我們創(chuàng)建了一個(gè)空的Vector,然后在第8行進(jìn)行了一堆的push操作。

假設(shè)我們有1024個(gè)元素要放入到Vector中,那就進(jìn)行了1024次push操作,就會(huì)導(dǎo)致在堆內(nèi)存上對(duì)Vector進(jìn)行多次重新分配。這是因?yàn)樵?vector 增加新元素時(shí),如果沒(méi)有足夠的空間就會(huì)要求分配大小是原內(nèi)存2倍的新內(nèi)存,并將老的元素拷貝到新的空間中,再銷毀舊內(nèi)存中的數(shù)據(jù)。

第一個(gè)需要改進(jìn)的地方是:將創(chuàng)建空Vector的語(yǔ)法Vec::new()改成Vec::with_capacity(count),根據(jù)count大小預(yù)先分配內(nèi)存空間,這樣就避免了一堆的內(nèi)存重新分配操作。

 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}
第二個(gè)需要改進(jìn)的地方是push,盡管已經(jīng)預(yù)先分配了內(nèi)存空間,但是每次執(zhí)行push操作后,指向元素的指針地址都會(huì)增長(zhǎng),都會(huì)進(jìn)行邊界檢查,這是不需要的。修改如下:
 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方法,參數(shù)需要一個(gè)iterator,我們使用了標(biāo)準(zhǔn)庫(kù)的std::repeat函數(shù),它會(huì)把element元素進(jìn)行clone。使用extend方法的好處是只會(huì)對(duì)iterator的范圍進(jìn)行一次邊界檢查,這樣就更加高效。

我們也可以使用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}
至此,關(guān)于Rust的聲明宏就學(xué)習(xí)完了。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3040

    瀏覽量

    74172
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4808

    瀏覽量

    68812
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    229

    瀏覽量

    6626

原文標(biāo)題:CRust學(xué)習(xí)筆記:聲明宏-3

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【RT-Thread學(xué)習(xí)筆記】一種C語(yǔ)言定義的寫法

    【RT-Thread學(xué)習(xí)筆記】一種C語(yǔ)言定義的寫法
    的頭像 發(fā)表于 07-30 13:41 ?2364次閱讀
    【RT-Thread<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】一種C語(yǔ)言<b class='flag-5'>宏</b>定義的寫法

    Linux內(nèi)核學(xué)習(xí)筆記:initcall

    寫過(guò)Linux驅(qū)動(dòng)的人都知道`module_init`,因?yàn)樗?b class='flag-5'>聲明了一個(gè)驅(qū)動(dòng)的入口函數(shù)。
    發(fā)表于 06-01 15:12 ?617次閱讀

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

    聲明:本文是在學(xué)習(xí)英飛凌 TC3XX系列多核 MCU 過(guò)程中整理的筆記,便于后期復(fù)習(xí)!
    發(fā)表于 09-19 09:54 ?2662次閱讀
    英飛凌TC3XX系列多核MCU<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>(1)

    請(qǐng)問(wèn)關(guān)于C6000系列庫(kù)中DISABLE ,DEFAULT這樣的是在哪個(gè)頭文件里聲明的?

    看到歷程中有很多定義,但是沒(méi)有找到是在哪個(gè)頭文件中聲明的,請(qǐng)問(wèn)如DISABLE ,DEFAULT這樣的是在哪個(gè)頭文件里聲明的??
    發(fā)表于 07-25 07:18

    MCU學(xué)習(xí)筆記相關(guān)資料分享

    MCU學(xué)習(xí)筆記C語(yǔ)言基礎(chǔ)1. 位操作2. define定義關(guān)鍵詞3. ifdef /ifndef 條件編譯4. extern變量聲明5. typedef 類型別名6. 結(jié)構(gòu)體7. s
    發(fā)表于 11-04 07:10

    Java設(shè)計(jì)模式學(xué)習(xí)筆記

    Java設(shè)計(jì)模式學(xué)習(xí)筆記
    發(fā)表于 09-08 10:15 ?5次下載
    Java設(shè)計(jì)模式<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    ARM學(xué)習(xí)筆記

    ARM學(xué)習(xí)筆記
    發(fā)表于 10-13 14:28 ?3次下載
    ARM<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    Altera FPGA CPLD學(xué)習(xí)筆記

    Altera FPGA CPLD學(xué)習(xí)筆記(肇慶理士電源技術(shù)有限)-Altera FPGA CPLD學(xué)習(xí)筆記? ? ? ? ? ? ? ? ?
    發(fā)表于 09-18 10:54 ?82次下載
    Altera FPGA CPLD<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    MCU學(xué)習(xí)筆記_C語(yǔ)言基礎(chǔ)

    MCU學(xué)習(xí)筆記C語(yǔ)言基礎(chǔ)1. 位操作2. define定義關(guān)鍵詞3. ifdef /ifndef 條件編譯4. extern變量聲明5. typedef 類型別名6. 結(jié)構(gòu)體7. s
    發(fā)表于 11-01 16:25 ?8次下載
    MCU<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>_C語(yǔ)言基礎(chǔ)

    學(xué)習(xí)筆記】單片機(jī)匯編學(xué)習(xí)

    學(xué)習(xí)筆記】單片機(jī)匯編學(xué)習(xí)
    發(fā)表于 11-14 18:21 ?15次下載
    【<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>】單片機(jī)匯編<b class='flag-5'>學(xué)習(xí)</b>

    CRust學(xué)習(xí)筆記:生命周期-1

    本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程。
    的頭像 發(fā)表于 12-19 09:33 ?904次閱讀

    CRust學(xué)習(xí)筆記:生命周期-2

    本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程。
    的頭像 發(fā)表于 12-19 09:34 ?922次閱讀

    CRust學(xué)習(xí)筆記:智能指針和內(nèi)部可變性

    本系列文章是Jon Gjengset發(fā)布的CRust of Rust系列視頻的學(xué)習(xí)筆記CRust of Rust是一系列持續(xù)更新的Rust中級(jí)教程。
    的頭像 發(fā)表于 01-29 14:58 ?849次閱讀

    Sentaurus TCAD學(xué)習(xí)筆記

    半導(dǎo)體仿真Sentaurus TCAD 學(xué)習(xí)筆記,僅供學(xué)習(xí)
    發(fā)表于 08-07 14:54 ?4次下載

    Allegro學(xué)習(xí)筆記.zip

    Allegro學(xué)習(xí)筆記
    發(fā)表于 12-30 09:19 ?6次下載
    主站蜘蛛池模板: 午夜亚洲福利| 拍拍拍无挡视频免费全程1000| 夜夜夜夜曰天天天天拍国产| 欧美成网| 色偷偷成人| 婷婷六月丁香午夜爱爱| 午夜大片网| 51影院在线观看成人免费| 久久综合成人网| 日韩三级一区| 特级毛片免费视频播放| www狠狠干| 亚洲视频一区在线| 网站四虎1515hhcom| 欧美又黄又嫩大片a级| 亚州色图欧美色图| 4hc44www四虎永久| 天天操天天做| 手机看片日韩福利| 午夜欧美精品久久久久久久| 天天干天天在线| 天堂在线视频| 国产精品美女久久久久网| 免费一级毛片清高播放| 天天拍夜夜添久久精品中文| 毛片在线不卡| 91网站网站网站在线| 国产呦在线观看视频| 免费福利影院| 欧美黑人xxxxxxxxxx| 欧美日穴| 国产又黄又爽又猛的免费视频播放| 人人射人人爽| 国产精品第九页| 中文字幕亚洲天堂| 好色亚洲| 日韩成人免费一级毛片| 国产网站免费视频| www.av在线.com| 午夜aaaaaaaaa视频在线| 国产精品福利视频手机免费观看|