女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

c++引用詳細(xì)解說3

jf_78858299 ? 來源:阿Q正磚 ? 作者:阿Q正磚 ? 2023-02-15 09:43 ? 次閱讀

但是臨時(shí)變量在哪?

  • 如果 c 比較小(4/8 byte),一般是寄存器充當(dāng)臨時(shí)變量,例如eax
  • 如果 c 比較大,臨時(shí)變量放在調(diào)用 add 函數(shù)的棧幀中,

最后將臨時(shí)變量中的值賦值給ret

圖:

圖片

所有的傳值返回都會(huì)生成一個(gè)拷貝

便于理解,看一下匯編

圖片

看第四句話,這里是說,把 eax 中的值,拷貝到 ret 中。

而再函數(shù)調(diào)用返回時(shí):

圖片

這里是將 c 的值放到 eax 中的。

這也就印證了返回時(shí),是以臨時(shí)拷貝形式返回的,由于返回值是 int ,所以是直接用的 eax 寄存器

而不論這個(gè)函數(shù)結(jié)束后,返回的那個(gè)值會(huì)不會(huì)被銷毀,都會(huì)創(chuàng)建臨時(shí)變量返回,例如這段代碼 :

int fun(){            static int n = 0;        n++;        return n;}
int main(){ int ret = fun(); cout << ret << endl; return 0;}

對(duì)于該函數(shù),編譯器仍然是創(chuàng)建臨時(shí)變量返回;因?yàn)榫幾g器不會(huì)對(duì)其進(jìn)行特殊處理。

看一下匯編:

圖片

仍然是放到 eax 寄存器中返回的。

埋個(gè)伏筆:你覺不覺的這個(gè)臨時(shí)變量創(chuàng)建的很冤枉,明明這塊空間一直存在,我卻依然創(chuàng)建臨時(shí)變量返回了?能不能幫它洗刷冤屈。

如果我改成引用返回會(huì)發(fā)生什么情況嗎?

int& add(int a, int b){            int c = a + b;            return c;}int main(){            int ret = add(1, 2);            cout << ret << endl;            return 0;}

引用返回就是不生成臨時(shí)變量,直接返回 c 的引用。而這里產(chǎn)生的問題就是 非法訪問 。

造成的問題:

  • 存在非法訪問,因?yàn)?add 的返回值是 c 的引用,所以 add 棧幀銷毀后,會(huì)訪問 c 位置空間,而這是讀操作,不一定檢查出來,但是本質(zhì)是錯(cuò)的。
  • 如果 add 函數(shù)棧幀銷毀,空間被清理,那么取 c 值時(shí)取到的就是隨機(jī)值,取決于編譯器的決策。

ps:雖然vs銷毀棧幀沒有清理空間數(shù)據(jù),但是會(huì)二次覆蓋

來看個(gè)有意思的:

圖片

例如這里,當(dāng)調(diào)用 add 函數(shù)之后,返回 c 的引用,接收返回值是用的ret相當(dāng)于是 c 的引用,這時(shí)由于沒有清理?xiàng)瑪?shù)據(jù),所以打印3;

但是第二次調(diào)用,重新建立棧幀,由于棧幀大小相同,第二次建立棧幀可能還是在原位置,之前空間的數(shù)據(jù)被覆蓋,繼續(xù)運(yùn)算,但是此時(shí),ret 那塊空間的值就被修改了,而這時(shí)沒有接收返回值,但是原先的那塊 c 的值被修改,所以打印出來 ret 是 30 。

所以使用引用返回時(shí),一旦返回后,返回值的空間被修改,那么都可能會(huì)造成錯(cuò)誤,使用要小心!

引用返回有一個(gè)原則:如果函數(shù)返回時(shí),出了函數(shù)作用域,如果返回對(duì)象還在(還沒還給系統(tǒng)),則可以使用引用返回,如果已經(jīng)還給系統(tǒng)了,則必須使用傳值返回。

它倆的區(qū)別就是一個(gè)生成拷貝,一個(gè)不生成拷貝。

而這時(shí) static 修飾的靜態(tài)變量不委屈了:

int& fun(){            static int n = 0;        n++;        return n;}

因?yàn)?static 修飾的變量在靜態(tài)區(qū),出了作用域也存在,這時(shí)就可以引用返回。

我們可以理解引用返回也有一個(gè)返回值,但是這個(gè)返回值的類型是 int& ,中間并不產(chǎn)生拷貝,因?yàn)榉祷氐氖莿e名。這就相當(dāng)于返回的就是它本身。

有時(shí)引用返回可以發(fā)揮出意想不到的結(jié)果:

#include#define N 10typedef struct Array{            int a[N];            int size;}AY;
int& PostAt(AY& ay, int i){ assert(i < N); return ay.a[i];}int main(){ AY ay; PostAt(ay, 1); // 修改返回值 for (int i = 0; i < N; i++) { PostAt(ay, i) = i * 3; } for (int i = 0; i < N; i++) { cout << PostAt(ay, i) << ' '; } return 0;}

由于PostAt 的形參 ay 為 main 中 局部變量 ay的別名,所以 ay 一直存在;這時(shí)可以使用引用返回。

引用返回 減少了值拷貝 ,不比將其拷貝到臨時(shí)變量中返回;并且由于是引用返回,我們也可以 修改返回對(duì)象 。

圖片

總結(jié)提煉:如果出了作用域,返回變量(靜態(tài),全局,上一層棧幀,malloc等)仍然存在,則可以使用引用返回。

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

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    諾基亞3G機(jī)2730c功能詳細(xì)解說

    諾基亞3G機(jī)2730c功能詳細(xì)解說 隨著3G在中國(guó)的快速普及,入門級(jí)市場(chǎng)的重要性也不斷提升。近期,諾基亞
    發(fā)表于 02-23 09:05 ?5610次閱讀

    Visual C++教程之C++的基礎(chǔ)知識(shí)介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是Visual C++教程之C++的基礎(chǔ)知識(shí)介紹主要內(nèi)容包括了:1 類和對(duì)象,2 類的成員及特性,3 繼承和派生類
    發(fā)表于 02-15 15:59 ?9次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的基礎(chǔ)知識(shí)介紹

    Visual C++教程之C++的語(yǔ)言資料概述免費(fèi)下載

    本文檔詳細(xì)介紹的是Visual C++教程之C++的語(yǔ)言資料概述免費(fèi)下載主要內(nèi)容包括了:1 從CC++的程序結(jié)構(gòu) ,2 程序書寫規(guī)范,
    發(fā)表于 02-15 15:59 ?3次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的語(yǔ)言資料概述免費(fèi)下載

    C++程序設(shè)計(jì)教程之?dāng)?shù)據(jù)類型的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是C++程序設(shè)計(jì)教程之?dāng)?shù)據(jù)類型的詳細(xì)資料說明。1. 整型 ( int Types ) , 2.整型子類 ( sub-int Types ) , 3.浮點(diǎn)型
    發(fā)表于 02-21 17:18 ?3次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之?dāng)?shù)據(jù)類型的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)教程之C++的初步知識(shí)的詳細(xì)資料說明

    C++程序設(shè)計(jì)教程之C++的初步知識(shí)的詳細(xì)資料說明包括了:1. 從CC++,2 . 最簡(jiǎn)單的C++
    發(fā)表于 03-14 14:48 ?31次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之<b class='flag-5'>C++</b>的初步知識(shí)的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)教程之?dāng)?shù)組的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之?dāng)?shù)組的詳細(xì)資料說明主要內(nèi)容包括了:1. 數(shù)組的概念,2. 一維數(shù)組的定義和引用3. 二維數(shù)組的定義和
    發(fā)表于 03-14 14:48 ?10次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之?dāng)?shù)組的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)教程之指針的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是C++程序設(shè)計(jì)教程之指針的詳細(xì)資料說明主要內(nèi)容包括了:1. 指針的概念,2. 變量與指針,3. 數(shù)組與指針,4. 字符串與指針,5. 函數(shù)與指針,6. 返回指針值的函
    發(fā)表于 03-14 16:04 ?7次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之指針的<b class='flag-5'>詳細(xì)</b>資料說明

    C++程序設(shè)計(jì)教程之C++工具的詳細(xì)資料說明

    本文檔的詳細(xì)介紹的是C++程序設(shè)計(jì)教程之C++工具的詳細(xì)資料說明主要內(nèi)容包括了:1. 異常處理,2. 命名空間,3. 使用早期的函數(shù)庫(kù)
    發(fā)表于 03-14 16:39 ?4次下載
    <b class='flag-5'>C++</b>程序設(shè)計(jì)教程之<b class='flag-5'>C++</b>工具的<b class='flag-5'>詳細(xì)</b>資料說明

    C++引用的使用場(chǎng)景

    C++引用的使用場(chǎng)景
    的頭像 發(fā)表于 06-29 15:18 ?4295次閱讀
    <b class='flag-5'>C++</b>:<b class='flag-5'>引用</b>的使用場(chǎng)景

    C++中的const和引用的討論

    今天給大家分享一下這段時(shí)間學(xué)習(xí)c++的總結(jié)學(xué)習(xí):c++里面的const關(guān)鍵字和引用
    的頭像 發(fā)表于 12-24 15:35 ?1028次閱讀

    C++基礎(chǔ)語(yǔ)法中的引用、封裝和多態(tài)

    本期是C++基礎(chǔ)語(yǔ)法分享的第六節(jié),今天給大家來分享一下: (1)引用; (2)宏; (3)成員初始化列表; (4)封裝; (5)繼承; (6)多態(tài); 引用 左值
    的頭像 發(fā)表于 09-12 09:58 ?1458次閱讀

    c++引用詳細(xì)解說1

    C++C語(yǔ)言的繼承,它可進(jìn)行過程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對(duì)象的程序設(shè)計(jì),還可以進(jìn)行以繼承和多態(tài)為特點(diǎn)的面向?qū)ο蟮某绦蛟O(shè)計(jì)。
    的頭像 發(fā)表于 02-15 09:40 ?755次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>1

    c++引用詳細(xì)解說2

    C++C語(yǔ)言的繼承,它可進(jìn)行過程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對(duì)象的程序設(shè)計(jì),還可以進(jìn)行以繼承和多態(tài)為特點(diǎn)的面向?qū)ο蟮某绦蛟O(shè)計(jì)。
    的頭像 發(fā)表于 02-15 09:43 ?648次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>2

    c++引用詳細(xì)解說4

    C++C語(yǔ)言的繼承,它可進(jìn)行過程化程序設(shè)計(jì),又可以進(jìn)行以抽象數(shù)據(jù)類型為特點(diǎn)的基于對(duì)象的程序設(shè)計(jì),還可以進(jìn)行以繼承和多態(tài)為特點(diǎn)的面向?qū)ο蟮某绦蛟O(shè)計(jì)。
    的頭像 發(fā)表于 02-15 09:43 ?688次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>解說</b>4

    C++引用和指針

    之前的文章我們已經(jīng)介紹了C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復(fù)雜的數(shù)據(jù)類型復(fù)合類型,所謂的復(fù)合類型就是通過其他類型定義的類型,本篇文章我們將會(huì)著重介紹C++的復(fù)合類型
    的頭像 發(fā)表于 03-17 14:00 ?798次閱讀