在线观看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次下載
    主站蜘蛛池模板: 久久99热狠狠色精品一区 | 国产一级特黄aa大片在线 | 人成xxxwww免费视频 | 奇米影色777四色在线首页 | 一级毛毛片毛片毛片毛片在线看 | 香蕉午夜视频 | 亚洲一区二区视频在线观看 | 欧美三级在线视频 | 狠狠色丁香九九婷婷综合五月 | 天天干天天澡 | 人人入人人爱 | 91久久福利国产成人精品 | 好大好硬好深好爽想要免费视频 | www性| 日本在线不卡视频 | 色在线视频观看 | 757福利影院合集3000 | 美女全黄网站免费观看 | 国产卡一卡2卡三卡免费视频 | 天天爱添天天爱添天天爱添 | 91福利视频免费 | 噜噜噜动态图超猛烈 | 午夜黄色福利 | 乱码中文字幕人成在线 | 久久久久久国产精品免费免 | 国产精品美女久久久久网 | 手机看片午夜 | 福利视频免费看 | 唯美久草| 123综合网在线| 一区二区三区视频在线观看 | 操操操综合网 | 医生好大好硬好爽好紧 | 萝l在线精品社区资源 | 九九re| 韩日色图 | 人人干人人干 | 68日本xxxxxxxxx777| 久久澡人人澡狠狠澡 | 欧美性网站 | 丁香六月 久久久 |