日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

警惕 C++ 中的隱式類型轉換

來源: 責編: 時間:2023-08-14 22:01:02 773觀看
導讀今天文章的主題靈感來自客戶的一個問題:我在研究一個代碼中的棧溢出問題。為了減小棧幀的大小,我盡可能多地刪除了局部變量,但仍有很多??臻g無法解釋。除了局部變量、參數、保存的寄存器和返回地址之外,棧上還有什么其他

今天文章的主題靈感來自客戶的一個問題:Uyn28資訊網——每日最新資訊28at.com

我在研究一個代碼中的棧溢出問題。為了減小棧幀的大小,我盡可能多地刪除了局部變量,但仍有很多??臻g無法解釋。除了局部變量、參數、保存的寄存器和返回地址之外,棧上還有什么其他的東西呢?Uyn28資訊網——每日最新資訊28at.com

我的回答是,嗯,還有結構化(SEH)的異常處理信息,但這通常不會占用太多??臻g,因此不會成為”大量”神秘棧使用的來源。Uyn28資訊網——每日最新資訊28at.com

我的猜測是,代碼正在生成大量大型 C++ 臨時對象。請考慮以下程序片段:Uyn28資訊網——每日最新資訊28at.com

Uyn28資訊網——每日最新資訊28at.com

有人會問了:”這段代碼是如何編譯的?函數Foo想要一個BigBuffer,而不是一個整數!” 然而編譯它確實如此。Uyn28資訊網——每日最新資訊28at.com

這是因為編譯器使用 BigBuffer 構造函數作為轉換器。換句話說,編譯器插入了以下臨時變量:Uyn28資訊網——每日最新資訊28at.com

Uyn28資訊網——每日最新資訊28at.com

這樣做是因為,只接受一個參數的構造函數有兩個目的:它可以用作傳統的構造函數(正如我們在 BigBuffer temp(3) 中看到的那樣),或者它可以用來提供從參數類型到構造類型的隱式轉換。在本例中,BigBuffer(int) 構造函數被用作從 int 到 BigBuffer 的轉換。Uyn28資訊網——每日最新資訊28at.com

若要防止這種情況發生,請使用 explicit 關鍵字:Uyn28資訊網——每日最新資訊28at.com

Uyn28資訊網——每日最新資訊28at.com

總結

通過今天的文章,我終于理解了在何種情況下需要在構造函數上加 explicit 。
你呢?Uyn28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-5714-0.html警惕 C++ 中的隱式類型轉換

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 讓我們一起聊一聊反射

下一篇: Go的Net/Http有哪些值得關注的細節?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 五莲县| 彰化市| 丁青县| 卓尼县| 古田县| 土默特右旗| 安新县| 庄河市| 宁南县| 黄冈市| 晴隆县| 松滋市| 西畴县| 阳谷县| 平谷区| 阿坝| 巴东县| 崇信县| 琼海市| 类乌齐县| 晋宁县| 斗六市| 泰州市| 三台县| 水城县| 富蕴县| 富源县| 屏南县| 三门峡市| 嘉禾县| 肃南| 当雄县| 永昌县| 姜堰市| 平遥县| 兰考县| 鸡东县| 望江县| 伊春市| 博乐市| 法库县|