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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

c++引用詳細解說3

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

但是臨時變量在哪?

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

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

圖:

圖片

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

便于理解,看一下匯編

圖片

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

而再函數調用返回時:

圖片

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

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

而不論這個函數結束后,返回的那個值會不會被銷毀,都會創建臨時變量返回,例如這段代碼 :

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

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

看一下匯編:

圖片

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

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

如果我改成引用返回會發生什么情況嗎?

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 的引用。而這里產生的問題就是 非法訪問 。

造成的問題:

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

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

來看個有意思的:

圖片

例如這里,當調用 add 函數之后,返回 c 的引用,接收返回值是用的ret相當于是 c 的引用,這時由于沒有清理棧幀數據,所以打印3;

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

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

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

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

而這時 static 修飾的靜態變量不委屈了:

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

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

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

有時引用返回可以發揮出意想不到的結果:

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

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

圖片

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137461
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73802
  • 面向對象
    +關注

    關注

    0

    文章

    64

    瀏覽量

    9999
收藏 人收藏

    評論

    相關推薦

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

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

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

    本文檔詳細介紹的是Visual C++教程之C++的語言資料概述免費下載主要內容包括了:1 從CC++的程序結構 ,2 程序書寫規范,
    發表于 02-15 15:59 ?3次下載
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的語言資料概述免費下載

    C++程序設計教程之數據類型的詳細資料說明

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

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

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

    C++程序設計教程之數組的詳細資料說明

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

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

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

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

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

    C++程序設計的基礎知識初步了解C++的資料免費下載

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

    C++引用的使用場景

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

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

    今天給大家分享一下這段時間學習c++的總結學習:c++里面的const關鍵字和引用
    的頭像 發表于 12-24 15:35 ?879次閱讀

    C++基礎語法中的引用、封裝和多態

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

    c++引用詳細解說1

    C++C語言的繼承,它可進行過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。
    的頭像 發表于 02-15 09:40 ?615次閱讀
    <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語言的繼承,它可進行過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。
    的頭像 發表于 02-15 09:43 ?530次閱讀
    <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語言的繼承,它可進行過程化程序設計,又可以進行以抽象數據類型為特點的基于對象的程序設計,還可以進行以繼承和多態為特點的面向對象的程序設計。
    的頭像 發表于 02-15 09:43 ?551次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b><b class='flag-5'>詳細</b><b class='flag-5'>解說</b>4

    C++引用和指針

    之前的文章我們已經介紹了C++中的基本類型如int,bool和double等,除了基本類型C++還有一些更復雜的數據類型復合類型,所謂的復合類型就是通過其他類型定義的類型,本篇文章我們將會著重介紹C++的復合類型
    的頭像 發表于 03-17 14:00 ?666次閱讀
    主站蜘蛛池模板: 国产精品免费一区二区三区四区 | brazzers欧美孕交 | 伊人在线视频 | 久久毛片网站 | jyzzjyzzz视频国产在线观看 | 父亲在线日本综艺免费观看全集 | 俄罗斯xxxxxbbbbb | 超碰免费视频在线观看 | 在线观看国产高清免费不卡 | 干了快生了的孕妇 | 国产成人 免费观看 | 蜜桃最新网址 | 浴室里强摁做开腿呻吟的漫画男男 | 亚洲中文热码在线视频 | 九九精彩视频在线观看视频 | 日韩一区二区三区视频在线观看 | 亚洲免费在线视频 | 粗好大用力好深快点漫画 | 午夜精品国产自在现线拍 | 国产精品99久久久精品无码 | 女人张开腿让男人桶爽免 | 国产精品成人无码久免费 | 国产AV午夜精品一区二区入口 | 免费国产成人手机在线观看 | 三级中国免费的 | 成人精品视频在线观看 | 福利片福利一区二区三区 | 秋霞伦理机在线看片 | 凹凸精品视频分类视频 | 翘臀少妇被扒开屁股日出水爆乳 | 精品无码国产自产在线观看 | 2022国产精品不卡a | 99re久久这里只有精品 | 中文字幕永久在线 | 任你躁国语自产二区在线播放 | 无码专区无码专区视频网网址 | 日日操夜夜摸 | 伊人网久久网 | GOGOGO高清免费播放 | 男人被绑着强行摸j | 国产免费看片 |