色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

c++引用詳細解說3

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

但是臨時變量在哪?

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

最后將臨時變量中的值賦值給ret

圖:

圖片

所有的傳值返回都會生成一個拷貝

便于理解,看一下匯編

圖片

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

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

圖片

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

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

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

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

對于該函數(shù),編譯器仍然是創(chuàng)建臨時變量返回;因為編譯器不會對其進行特殊處理。

看一下匯編:

圖片

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

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

如果我改成引用返回會發(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;}

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

造成的問題:

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

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

來看個有意思的:

圖片

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

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

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

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

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

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

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

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

我們可以理解引用返回也有一個返回值,但是這個返回值的類型是 int& ,中間并不產(chǎn)生拷貝,因為返回的是別名。這就相當(dāng)于返回的就是它本身。

有時引用返回可以發(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 一直存在;這時可以使用引用返回。

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

圖片

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

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

    評論

    相關(guān)推薦

    諾基亞3G機2730c功能詳細解說

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

    Visual C++教程之C++的語言資料概述免費下載

    本文檔詳細介紹的是Visual C++教程之C++的語言資料概述免費下載主要內(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>的語言資料概述免費下載

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

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

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

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

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

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

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

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

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

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

    C++程序設(shè)計的基礎(chǔ)知識初步了解C++的資料免費下載

    本文檔的主要內(nèi)容詳細介紹的是C++程序設(shè)計的基礎(chǔ)知識初步了解C++的資料免費下載包括了:1 認識C++,2 C++的現(xiàn)狀和發(fā)展,
    發(fā)表于 06-10 08:00 ?25次下載
    <b class='flag-5'>C++</b>程序設(shè)計的基礎(chǔ)知識初步了解<b class='flag-5'>C++</b>的資料免費下載

    C++引用的使用場景

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

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

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

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

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

    c++引用詳細解說1

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

    c++引用詳細解說2

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

    c++引用詳細解說4

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

    C++引用和指針

    之前的文章我們已經(jīng)介紹了C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復(fù)雜的數(shù)據(jù)類型復(fù)合類型,所謂的復(fù)合類型就是通過其他類型定義的類型,本篇文章我們將會著重介紹C++的復(fù)合類型
    的頭像 發(fā)表于 03-17 14:00 ?629次閱讀
    主站蜘蛛池模板: 成人AV无码一二二区视频免费看| 国产在线中文字幕| 久久欧洲视频| 为什么丈夫插我我却喜欢被打着插| 中文字幕午夜福利片| 国产第一页浮力影院| 美女张开让男生桶| 亚洲日本激情| 高清 国产 在线 亚洲| 男人扒开添女人屁股| 亚洲三级大片| 国产精品视频人人做人人爽| 欧美男同gay粗大又长| 中文日韩亚洲欧美字幕| 国产亚洲精品黑人粗大精选| 日本熟妇乱人伦A片精品软件| 永久免费的无码中文字幕| 国产性夜夜春夜夜爽1A片| 色99蜜臀AV无码| a视频在线观看免费| 久久伊人天堂视频网| 亚洲欧美人成视频在线| 国产精品久久国产三级国不卡顿 | 午夜理伦大片一级| 被老头下药玩好爽| 男总裁憋尿PLAY灌尿BL| 在线亚洲中文字幕36页| 黄色a三级免费看| 亚洲成人免费在线| 国产精品久久欧美一区| 色www永久免费| 吃奶摸下的羞羞漫画| 欧美日韩精品| a在线视频免费观看| 欧美 亚洲 中文字幕 高清| 最近在线视频观看2018免费| 久久高清免费视频| 一二三四在线视频社区8| 禁漫H天堂免费A漫| 亚洲欧美综合中文| 寂寞骚妇女被后入式抽插|