成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深度剖析C++資源管理細節

開發 后端
C++資源管理兩門語言的定位不同,它們在資源管理方面采取了兩種截然不同的方式:一為GC,一為RAII。

我們從系統結構的角度上講,C/C++ 支持 3 種內存管理方式,基于棧的C++資源管理,基于堆的動態管理,和基于全局區的靜態管理,僅供大家學習切磋。

C++資源管理兩門語言的定位不同,它們在資源管理方面采取了兩種截然不同的方式:一為GC,一為RAII。GC讓程序建立在更高的抽象層次上,使資源管理變得更方便,更安全;而RAII則保留了C的底層能力,同時在C++特性的支持下提供了簡單有效的資源管理方式。

我們知道C++最激烈的批評往往來自于C社區,而在我看來C程序員可以不接受虛函數,不接受模板,但有什么理由不接受RAII呢?可以說RAII是C++相對C來說幾乎無副作用的明顯進步。

下面就從GC開始:

C#通過CLR管理托管內存,用引用抽象代替指針間接操作托管內存,讓程序員在更高的層次上安全地使用資源。這使得C#失去了直接管理內存的能力,但換來了以下好處:

1.類型安全:在C/C++中可以通過類型轉換把整數或其他類型的指針轉換為特定類型的指針,這意味著指針是非類型安全的,必須由程序員來保證指針代表的內存空間的合法性。而C#引用可以看作是類型安全的指針,as運算符可以保證轉換的類型安全性。

2.內存整理:創建對象需要從堆中動態分配連續的內存空間,由于不同對象的內存大小是不同的,常見的***匹配和***匹配堆分配算法都會造成堆中的內存碎片問題。碎片的存在使實際可用內存小于物理內存,所以應盡量減少碎片的產生。

一個方向是設計更好的內存分配算法;另一個方向是通過周期性地進行內存整理調整優化。在C++資源管理中,由于指針代表了絕對地址,因此不存在通用的內存整理算法;而C#屏蔽了指針,通過引用操作對象,就使得內存整理成為可能。

PS:這并不意味著C/C++內存分配就弱于C#,C++資源管理可以為某種類型的對象設計專用的內存分配方式,甚至把對象指定分配到某一物理地址空間,這些都是C#不具備的。

托管和非托管資源

在C#中,資源分為托管資源和非托管資源兩種。GC在回收無用對象資源時,可以自動回收托管資源(比如托管內存),但對于非托管資源(比如Socket、文件、數據庫連接)必須在程序中顯式釋放。

托管資源的回收首先需要GC識別無用對象,然后回收其資源。一般無用對象是指通過當前的系統根對象和調用堆棧對象不可達的對象。對象有一個重要的特點導致無用對象判斷的復雜性:對象間的相互引用!如果沒有相互引用,就可以通過“引用計數”這種簡單高效的方式實現無用對象的判斷,并實現實時回收。

正是由于相互引用的存在導致GC需要設計更為復雜的算法,這樣帶來的***問題在于喪失了資源回收的實時性,而變成一種不確定的方式。對于非托管資源的釋放,C#提供了兩種方式:

1.Finalizer:寫法貌似C++資源管理的析構函數,本質上卻相差甚遠。Finalizer是對象被GC回收之前調用的終結器,初衷是在這里釋放非托管資源,但由于GC運行時機的不確定性,通常會導致非托管資源釋放不及時。

另外,Finalizer可能還會有意想不到的副作用,比如:被回收的對象已經沒有被其他可用對象所引用,但Finalizer內部卻把它重新變成可用,這就破壞了GC垃圾收集過程的原子性,增大了GC開銷。

2.Dispose Pattern:C#提供using關鍵字支持Dispose Pattern進行資源釋放。這樣能通過確定的方式釋放非托管資源,而且using結構提供了異常安全性。所以,一般建議采用Dispose Pattern,并在Finalizer中輔以檢查,如果忘記顯式Dispose對象則在Finalizer中釋放資源。

可以說,GC為程序帶來安全方便的同時也付出了不小的代價:一則喪失了托管資源回收的實時性,這在實時系統和資源受限系統中是致命的;二則沒有把托管資源和非托管資源的管理統一起來,造成概念割裂。#t#

C++的定位之一是底層開發能力,所以不難理解GC并沒有成為C++的語言特性。雖然我們在C++0x和各種第三方庫都能看到GC的身影,但GC對于C++來講并不是那么重要,至多是一個有益的補充。C++資源管理足以傲視C,并和C# GC一較高下的是它的RAII。

責任編輯:chenqingxiang 來源: NET130
相關推薦

2010-02-05 13:52:04

C++資源管理

2010-01-28 16:31:54

C++類型

2010-01-28 15:09:36

C++資源管理

2010-01-15 10:32:21

C++語言

2024-03-04 10:53:08

RAIIC++開發

2010-01-26 14:46:42

C++語言

2009-08-19 13:36:21

C++資源管理方式

2010-01-26 17:16:33

C++應用程序

2010-01-13 10:16:42

C++軟件

2010-01-27 15:50:23

C++復雜性

2010-01-11 10:19:57

C++開發工具

2010-01-11 17:43:23

C++程序設計

2010-01-13 11:14:06

C++虛表

2010-01-12 15:03:33

C++代碼

2015-11-30 11:14:59

C++對象池自動回收

2010-01-14 17:42:47

CC++

2010-01-13 13:42:55

C++編譯器

2025-05-06 09:12:46

2009-06-24 14:18:47

資源管理敏捷項目

2013-12-21 19:58:32

SDN應用資源管理平臺SDN
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美九九| 欧美激情一区二区三级高清视频 | 国产精品2区 | 一区二区久久 | 亚洲成a人片 | 欧州一区 | 久久综合久久自在自线精品自 | 国产精品成人品 | 九色在线观看 | 国产福利在线免费观看 | 欧美成人h版在线观看 | 日本精品一区二区三区视频 | 色视频网站 | 欧美a级成人淫片免费看 | 成人日韩精品 | 亚洲一区二区在线电影 | 一区二区国产精品 | 中文字幕精品视频 | 日韩精品视频中文字幕 | 99资源| 欧美综合久久久 | 国产欧美在线一区 | 国产一级片网站 | 久久精彩视频 | 欧美一区二区三区在线观看视频 | 一级做a爰片性色毛片16美国 | 岛国av一区二区 | 涩涩导航 | 日日夜夜精品视频 | www.亚洲一区二区 | 黄色片在线网站 | 日韩一区二区三区精品 | 久久久久九九九女人毛片 | 国产精品夜夜夜一区二区三区尤 | 国产精品久久久久久久久久 | 99久久久无码国产精品 | 精品久久中文字幕 | 国产在线精品一区二区三区 | 中文字幕视频在线观看 | 又爽又黄axxx片免费观看 | 亚洲国产精品99久久久久久久久 |