C 基礎知識

2021-08-22 07:11:01 字數 3383 閱讀 3353

1、智慧型指標

智慧型指標實際上是乙個棧物件,並非指標型別,在棧物件生命期即將結束時,智慧型指標通過析構函式釋放由它管理的堆記憶體。所有智慧型指標都過載了「operator->」操作符,直接返回物件的引用,用以操作物件。訪問智慧型指標包含的裸指標則可以用get()函式。由於智慧型指標是乙個物件,所以if(my_smart_object)永遠為真,要判斷智慧型指標的裸指標是否為空,需要這樣判斷:if(my_smart_object.get())。智慧型指標包含了reset()方法,如果不傳遞引數(或者傳遞null),則智慧型指標會釋放當前管理的記憶體。如果穿第乙個物件,則智慧型指標會釋放當前物件,來管理新傳入的物件。

智慧型指標可以像類的原是指標一樣訪問類的public成員,成員函式get()返回乙個原始的指標,成員函式reset()重新繫結指向的物件,而原來的物件則被釋放。

unique_ptr支援動態陣列,而shared_ptr不能支援動態陣列。

std::unique_ptrptr(new int[10]);合法

std::shared_ptrptr(new int[10]);是不合法的

如果通過std::shared_ptr來構造動態陣列,則需要顯式指定刪除器,比如下面的**:

std::shared_ptrp(new int[10], (int* p)); //指定delete

也可以用std::default_delete作為刪除器:

std::shared_ptrp(new int[10], std::default_delete);

2、元祖

在乙個資料庫中,一組按照順序排列的資料所組成的記錄;乙個資料結構,由逗號分隔的,用於傳遞給乙個程式或者作業系統的一系列值的組合。

3、auto

auto是乙個自動儲存變數的關鍵字,也就是申明一塊臨時的變數記憶體。在c++11中,auto被定義為自動推斷變數的型別。

auto x=5.2;  //x被auto推斷為double型別

4、原子操作

原子操作表示在多個執行緒訪問同乙個全域性資源的時候,能夠確保所有其他的執行緒都不在同一時間內訪問相同的資源,也就是它確保了同一時刻只有唯一的執行緒對這個資源進行訪問。從而避免了鎖的使用,提高了效率。

原子操作的實現跟普通資料型別類似,但是它能夠在保證結果正確的前提下,提供比mutex等鎖機制更好的效能。

5、鎖

在linux核心中,同步機制是一大特性。比較經典的有原子操作、spin_lock(自旋鎖)、mutex(互斥鎖)、semaphore(訊號量)等。

原子操作主要用於實現資源計數,很多引用計數就是通過原子操作實現的。

互斥鎖主要用於實現核心中的互斥訪問功能。同一時間只能有乙個任務持有互斥鎖,而且只有這個任務可以對互斥鎖進行解鎖。互斥鎖不能進行遞迴鎖定或解鎖。乙個任務在持有互斥鎖的時候是不能結束的。互斥鎖所使用的記憶體區域是不能被釋放的。使用中的互斥鎖是不能重新初始化的。並且互斥鎖不能用於中斷上下文。

自旋鎖與互斥鎖有點類似,只是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖。由於自旋鎖使用者一般保持鎖時間非常短,因此選擇自選而不是睡眠是非常必要的,自旋鎖的效率遠高於互斥鎖。自旋鎖存在兩個問題:死鎖和過多占用cpu。

6、unordered_map

1)使用unordered_map需要

#include//在unordered_map之前加上tr1庫名

using namespace std::tr1; //以此同時需要加上命名空間

2)查詢元素是否存在

若有unordered_mapmp;查詢x是否在map中

方法1:若存在mp.find(x)!=mp.end()

方法2:若存在mp.count(x)!=0

3)插入資料

map.insert(map::value_type(1,」raoul」);

4)遍歷map

unordered_map::iterator it;

(*it).first; //the key value

for(unordered_map::iterator iter=mp.begin();iter!=mp.end();iter++)

也可以這樣

for(auto& v:mp)

print v.first and v.second

內部實現機理:

1) map:內部實現了乙個紅黑樹,該結構具有自動排序的功能,因此map內部的所有元素都是有序的,紅黑樹的每乙個節點都代表著map的乙個元素,因此,對於map進行的查詢、刪除、新增等一系列的操作都相當於是對紅黑樹進行這樣的操作,故紅黑樹的效率決定了map的效率。

優點:元素的有序性在很多應用中都會簡化很多的操作;紅黑樹使得map的效率非常高。插入乙個元素到紅黑樹的時間為log(n),採用插入方式構建元素個數為n的紅黑樹的時間複雜度為nlog(n)。遍歷一顆紅黑樹的時間複雜度為o(n)

缺點:空間佔用率高,雖然提高了執行效率,但是因為每乙個節點都需要額外儲存父節點、孩子節點以及紅黑性質,使得每乙個節點都占用大量的空間。

適用於那些對順序有要求的問題。

2) unordered_map:內部實現了乙個雜湊表,因此其元素的排列順序是雜亂的、無序的

優點:內部實現了雜湊表,因此其查詢速度非常的快

缺點:雜湊表的建立比較耗費時間

適用於查詢問題。

7、指標函式與函式指標

指標函式:本質是乙個函式,函式返回型別是某一型別的指標

格式: 型別識別符號 *函式名(參數列)

int *f(x,y)

函式指標:指向函式的指標變數,本質是乙個指標變數

格式:型別說明符 (*函式名)(引數)

int (*f)(int x)

指向函式的指標包含了函式的位址,可以通過它來呼叫函式

8、make_shared()、shared_ptr()

shared_ptr的構造還需要new呼叫,這導致了**的某種不對稱性。

make_shared()來消除顯示的new呼叫

template

shared_ptrmake_shared(args &&… args);

make_shared函式比直接建立shared_ptr物件的方式快且高效,因為它內部僅分配一次記憶體,消除了shared_ptr構造時的開銷。

9、boost::noncopyable介紹

通常情況下,要寫乙個單例類就要在類的宣告把它們的建構函式、賦值函式、析構函式、複製建構函式隱藏到private或者protected之中,每個類都這麼做麻煩。

有noncopyable類,只要讓單例類直接繼承noncopyable。

C 基礎知識

抽象類 abstract class 一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。介面 inte ce 只含有共有抽象方法 public abstract method 的類。這些方法必須在子類中被實現。反射 程式集包含模...

c 基礎知識

或運算的意義是什麼 0 0 0 0 1 1 1 0 1 1 1 1 無進製與運算的意義是什麼 在vc中,視窗的每個屬性對應乙個只有一位為1的16位的二進位制數,當增加某屬性做或運算 即可,取消某個屬性只需與 上這個屬性的取反。cs.style ws maximizebox 和cs.style cs....

C 基礎知識

1 malloc和new區別與聯絡 a malloc malloc為函式,需要標頭檔案,申請的無型別,需要強制轉換 free釋放。示例 char p char malloc 10 sizeof char free p b new new是運算子,不需要標頭檔案,申請的是有型別的,自動呼叫建構函式 d...