1. 強型別列舉
//c++11的強型別列舉可以指定底層基於的基本型別,我們可以避免編譯器不同而帶來的不可移植性。
//另外,設定較小的基本型別也可以節省記憶體空間。
enum class c : char ;
enum class d : unsigned int ;
cout << "sizeof(c):" << sizeof(c) << endl; //1
cout << "sizeof(c::c1):" << sizeof(c::c1) << endl; //1
cout << "sizeof(d::d1)" << sizeof(d::d1) << endl; //4
2. 堆記憶體管理:智慧型指標與垃圾**
2.1 顯式記憶體管理
從語言層面來講,c++中記憶體相關的問題可以歸納為三個方面。
2.2. c++11 智慧型指標
void testuniqueptr()
從實現上講, unique_ptr 是乙個刪除了拷貝建構函式、保留了移動建構函式的指標封裝型別。程式設計師僅可以使用右值對 unique_ptr 物件進行構造,而且一旦構造成功,右值物件中的指標即被「竊取」,因此該右值物件即刻失去了對指標的「所有權」。
shared_ptrsp1(new int(22));
shared_ptrsp2 = sp1;
auto sp3 = sp1;
cout << "*sp1:" << *sp1 << endl; //22
cout << "*sp2:" << *sp2 << endl; //22
sp1.reset();
cout << "*sp2:" << *sp2 << endl; //22
cout << "*sp3:" << *sp3 << endl; //22
sp2.reset();
cout << "*sp3:" << *sp3 << endl; //22
而 shared_ptr 同樣形如其名,允許多個該智慧型指標共享地「擁有」同一堆分配物件的記憶體。與 unique_ptr 不同的是,由於在事項上採用了引用計數,所以一旦乙個 shard_ptr 指標放棄了「所有權」,其他的 shared_ptr 對物件記憶體的引用並不會受影響。某個智慧型指標呼叫 reset 知會導致引用計數的降低,不會導致堆記憶體的釋放。
2.3 垃圾**的分類
我們把之前使用過,現在不再使用或者沒有任何指標再指向的記憶體空間就稱為 「垃圾」。而將這些 「垃圾」收集起來以便再次利用的機制,就被稱為「垃圾**」。
在當前流行的程式語言中,除過 c 和 pascal 不支援,c++ 部分支援外,其他語言大多都支援自動**。
垃圾**的方式雖然很多,但主要可以分為兩大類:
(1)基於引用計數的垃圾**器
簡單地說,引用計數主要是使用系統記錄物件被引用(引用、指標)的次數。當物件被引用的次數變為 0 時,該物件即被視作 「垃圾」而**。使用引用計數做垃圾**的演算法的乙個優點是實現很簡單,與其他垃圾**演算法相比,該方法不會造成程式暫停,因為技術的增減與物件的使用是緊密結合的。此外,引用計數也不會對系統的快取或者交換空間贊成衝擊,因此被認為「***」較小。但是這種方法比較難處理「環形引用」問題,此外由於技術帶來的額外開銷也並不小,所以在使用上也有一定的限制。
(2)基於跟蹤處理的垃圾**器
相比於引用計數,跟蹤處理的垃圾**機制被更廣泛地引用。器基本方法是產生跟蹤物件的關係圖,然後進行垃圾**。使用跟蹤方式的垃圾**演算法主要有以下幾種:
2.4 c++ 與垃圾**
指標的靈活性使用可能是 c/c++ 中的一大優勢,而對於垃圾**來說,卻會帶來很大的困擾。
C 學習11 函式提高
在c 中,函式的形參列表中的形參是可以有預設值的。語法 返回值型別 函式名 引數 預設值 示例 int func int a,int b 10,int c 10 1.如果某個位置引數有預設值,那麼從這個位置往後,從左向右,必須都要有預設值 2.如果函式宣告有預設值,函式實現的時候就不能有預設引數 i...
13 C語言提高(三)
1.結構體中指標變數的深拷貝和淺拷貝 疑問點記錄 char p char malloc 100 strcpy p,renzhenming 這兩行 定義了乙個字元指標p,他指向堆記憶體中一段空間,這一段空間儲存了乙個字串renzhenming,那麼既然這個指標指向了這塊記憶體,那麼我通過取指標元素符號...
c 11 auto,decltype型別推導
auto型別推導 1.auto推導 auto x 5 被編譯器推導為int型別 auto pi new auto 1 編譯器推導為int const auto v x,u 5 v為 const int u為 const int static auto y 0.1 y為static const dou...