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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

通過此更改, 對 Foo(3) 的調用會引發編譯器錯誤:sYa28資訊網——每日最新資訊28at.com

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

總結

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

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

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

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

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 贺兰县| 绥宁县| 乌海市| 临城县| 翁牛特旗| 乌拉特前旗| 宁蒗| 岚皋县| 萨嘎县| 新建县| 怀安县| 江川县| 松阳县| 肥城市| 苗栗市| 延庆县| 汝南县| 桃源县| 曲水县| 洛南县| 雷山县| 大埔县| 施甸县| 电白县| 沾化县| 岳池县| 龙州县| 高唐县| 财经| 怀柔区| 淅川县| 郯城县| 汾西县| 资阳市| 彩票| 南川市| 建平县| 大英县| 土默特右旗| 南安市| 青河县|