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

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

C++中的低級內存操作

來源: 責編: 時間:2023-11-17 17:14:10 294觀看
導讀C++相較于C有一個巨大的優勢,那就是你不需要過多地擔心內存管理。如果你使用面向對象的編程方式,你只需要確保每個獨立的類都能妥善地管理自己的內存。通過構造和析構,編譯器會幫助你管理內存,告訴你什么時候需要進行內存

C++相較于C有一個巨大的優勢,那就是你不需要過多地擔心內存管理。如果你使用面向對象的編程方式,你只需要確保每個獨立的類都能妥善地管理自己的內存。通過構造和析構,編譯器會幫助你管理內存,告訴你什么時候需要進行內存操作。將內存管理隱藏在類中顯著提高了可用性,這一點在標準庫類中得到了很好的體現。YYJ28資訊網——每日最新資訊28at.com

然而,在某些應用程序或遺留代碼中,你可能會遇到需要更低級別地操作內存的情況。無論是出于遺留代碼、效率、調試還是好奇心,了解如何操作原始字節總是有幫助的。YYJ28資訊網——每日最新資訊28at.com

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

指針

C++編譯器會使用指針的聲明類型來允許你進行指針算術。如果你聲明了一個指向整數的指針并將其增加1,那么這個指針在內存中前進的距離是整數的大小,而不是一個單一的字節。這種操作對數組最有用,因為數組包含的數據是類型一致且在內存中連續的。YYJ28資訊網——每日最新資訊28at.com

例如,假設你在自由存儲區聲明了一個整數數組:YYJ28資訊網——每日最新資訊28at.com

 int* myArray { new int[8] };

你可能已經熟悉了以下用于設置索引為2的值的語法:YYJ28資訊網——每日最新資訊28at.com

myArray[2] = 33;

通過使用指針算術,你也可以使用以下等效的語法,該語法獲取到myArray“向前兩個整數”處的內存的指針,然后解引用它以設置該值:YYJ28資訊網——每日最新資訊28at.com

 *(myArray + 2) = 33;

作為訪問單個元素的另一種語法,指針算術看起來可能不太吸引人。但其真正的力量在于,像myArray+2這樣的表達式仍然是一個指向整數的指針,因此可以表示一個更小的整數數組。YYJ28資訊網——每日最新資訊28at.com

讓我們通過一個使用寬字符串的例子來看看。寬字符串支持所謂的Unicode字符,以表示例如日語字符串。wchar_t類型是一個可以容納這種Unicode字符的字符類型,并且通常比char要大;也就是說,它不僅僅是一個字節。要告訴編譯器一個字符串字面量是一個寬字符串字面量,可以在其前面加上一個L。YYJ28資訊網——每日最新資訊28at.com

例如,假設你有以下寬字符串:YYJ28資訊網——每日最新資訊28at.com

const wchar_t* myString { L"Hello, World" };

進一步假設你有一個函數,該函數接受一個寬字符串并返回一個包含輸入字符串大寫版本的新字符串:YYJ28資訊網——每日最新資訊28at.com

wchar_t* toCaps(const wchar_t* text);

請記住,C風格的字符串是以零結尾的,即它們的最后一個元素包含/0。因此,沒有必要在函數中添加一個大小參數來指定輸入字符串的長度。該函數只需不斷地迭代字符串的各個字符,直到遇到/0字符為止。YYJ28資訊網——每日最新資訊28at.com

通過將myString傳遞給toCaps()函數,你可以將其全部轉換為大寫。然而,如果你只想部分地大寫化myString,你可以使用指針算術來僅引用字符串的后一部分。下面的代碼通過僅向指針加7來調用toCaps()函數,以處理寬字符串中的“World”部分,盡管wchar_t通常超過1個字節:YYJ28資訊網——每日最新資訊28at.com

toCaps(myString + 7);

另一個有用的指針算術應用涉及到減法。從同一類型的另一個指針中減去一個指針會給你兩個指針之間指向類型的元素數量,而不是它們之間的絕對字節數。YYJ28資訊網——每日最新資訊28at.com

自定義內存管理

在你將遇到的99%(有人可能會說100%)的情況中,C++中的內置內存分配功能是足夠的。在幕后,new和delete完成了以適當大小的塊分配內存、維護可用內存區域列表以及在刪除時將內存塊釋放回該列表的所有工作。但是,當資源約束非常緊張,或者在非常特殊的條件下,例如管理共享內存,實施自定義內存管理可能是一個可行的選項。不用擔心,這并不像聽起來那么可怕。YYJ28資訊網——每日最新資訊28at.com

基本上,自己管理內存意味著類會分配一大塊內存,并根據需要將該內存分配出去。這種方法有什么好處呢?管理自己的內存可能會減少開銷。當你使用new來分配內存時,程序還需要預留一小部分空間以記錄分配了多少內存。這樣,當你調用delete時,可以釋放適當數量的內存。對于大多數對象,開銷比分配的內存小得多,因此影響甚微。然而,對于小對象或有大量對象的程序,開銷可能會產生影響。當你自己管理內存時,你可能會提前知道每個對象的大小,因此你可能能夠避免每個對象的開銷。對于大量的小對象來說,差異可能是巨大的。YYJ28資訊網——每日最新資訊28at.com

執行自定義內存管理需要重載new和delete操作符。YYJ28資訊網——每日最新資訊28at.com

垃圾收集

在支持垃圾收集的環境中,程序員很少(如果有的話)明確釋放與對象關聯的內存。相反,不再有任何引用的對象將在某個時候被運行時庫自動清理。垃圾收集沒有像在C#和Java中那樣內置到C++語言中。在現代C++中,你使用智能指針來管理內存,而在遺留代碼中,你將看到通過new和delete在對象級別進行內存管理。YYJ28資訊網——每日最新資訊28at.com

諸如shared_ptr這樣的智能指針提供了與垃圾收集內存非常相似的東西;也就是說,當某一資源的最后一個shared_ptr實例被銷毀時,該資源也會在那個時刻被銷毀。在C++中實現真正的垃圾收集是可能但不容易的,但釋放自己從釋放內存的任務中可能會引入新的問題。YYJ28資訊網——每日最新資訊28at.com

標記-清除垃圾收集

一種垃圾收集的方法被稱為“標記-清除”(Mark and Sweep)。在這種方法下,垃圾收集器會周期性地檢查程序中的每一個指針,并標注哪些內存仍然在使用中。在周期結束時,任何沒有被標記的內存被認為是不再使用的,并會被釋放。在C++中實現這樣的算法并不簡單,如果做錯了,可能比使用delete更容易出錯!YYJ28資訊網——每日最新資訊28at.com

盡管在C++中已經有了安全且簡單的垃圾收集機制的嘗試,但即使有了完美的C++垃圾收集實現,也不一定適用于所有應用程序。垃圾收集的缺點包括:YYJ28資訊網——每日最新資訊28at.com

  • 當垃圾收集器正在運行時,程序可能變得無響應。
  • 在使用垃圾收集器的情況下,你會遇到所謂的“非確定性析構函數”。因為一個對象在被垃圾收集之前不會被銷毀,所以析構函數在對象離開其作用域時不會立即執行。這意味著,由析構函數完成的資源清理(例如關閉文件、釋放鎖等)直到未來某個不確定的時間才會被執行。

編寫垃圾收集機制是非常困難的。你很可能會做錯,而且很可能會很慢。因此,如果你確實想在你的應用程序中使用垃圾收集內存,我強烈建議你研究現有的專門的垃圾收集庫,并重用它們。YYJ28資訊網——每日最新資訊28at.com

對象池

垃圾收集就像是為野餐購買盤子,并將用過的盤子留在院子里,以便某人在某個時候將它們撿起來并扔掉。肯定有更環保的內存管理方法。對象池就是回收的等價物。你購買了一定數量的盤子,使用過一個盤子后,你將其清洗,以便以后可以再次使用。YYJ28資訊網——每日最新資訊28at.com

對象池是理想的解決方案,適用于你需要在一段時間內多次使用相同類型的多個對象,并且每次創建都會產生開銷的情況。YYJ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-27972-0.htmlC++中的低級內存操作

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

上一篇: C++智能指針enable_shared_from_this

下一篇: 開源 | 攜程 Redis On Rocks 實踐,節省 2/3 Redis成本

標簽:
  • 熱門焦點
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標系統提供非預期的輸入并監視異常結果來發現軟件漏洞的方法。可以用來發現應用程序、操作系統和網絡協議等中的漏洞或
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網消息,據彭博社報道,在8月3日印度突然禁止在沒有許可證的情況下向印度進口電腦/平板及顯示器等產品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 三星獲批量產iPhone 15全系屏幕:蘋果史上最驚艷直屏

    按照慣例,蘋果將繼續在今年9月舉辦一年一度的秋季新品發布會,有傳言稱發布會將于9月12日舉行,屆時全新的iPhone 15系列將正式與大家見面,不出意外的話
  • 質感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 微軟發布Windows 11新版 引入全新任務欄狀態

    近日,微軟發布了Windows 11新版,而Build 22563更新主要引入了幾周前曝光的平板模式任務欄等,系統更流暢了。更新中,Windows 11加入了專門針對平板優化的任務欄
Top