AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

總結

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

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

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

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

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

標簽:
  • 熱門焦點
Top