**
1. 全域性靜態變數
記憶體中位置:靜態儲存區,且程式執行期間一直存在。
未經初始化的全域性靜態變數自動初始化為0。
全域性靜態變數在宣告檔案之外是不可見的。
2.區域性靜態變數
記憶體中位置:靜態儲存區。
未初始化自動初始化為0。
作用域為區域性作用域,但離開作用域後不會銷毀,仍然駐留在記憶體中,再次訪問時值不變。
3.靜態函式
函式定義宣告預設為extern,但靜態函式只在宣告的檔案中可見,其他檔案不可見。
即使用static修飾則該函式只能在本檔案中使用,且不會與其他檔案中同名函式衝突。
全域性函式應在標頭檔案中宣告,區域性函式在cpp中宣告帶static
4.類靜態成員
同乙個類中靜態成員在多個物件之間資料共享。
5.類靜態函式
.在靜態成員函式中不能直接引用類中的非靜態成員,但可以引用類中的靜態成員。靜態成員函式中藥引用非靜態成員時要通過物件來引用
棧區:編譯器自動分配和釋放,存放函式引數值、區域性變數等,操作方式類似棧。棧區最大值為1m,可以調整
堆區:手動申請的動態記憶體,分配方式類似於鍊錶。
全域性/靜態區(資料段):已初始化的全域性變數和靜態變數。
bss段:未初始化的全域性變數和靜態變數,以及被初始化為0的全域性變數和靜態變數
程式**區(**段):存放函式體二進位制**,唯讀儲存區。
首先引數從右向左壓棧,將返回位址壓棧,再將棧幀壓棧。
生成乙個臨時變數,將其引用作為函式引數傳入函式內。不能返回區域性變數指標和引用。
strcpy為字串拷貝函式,原型:char *strcpy(char* dest, const char *src);
從src拷貝到dest,遇到『\0』結束。可能導致越界,安全應用strncpy(char* dest, const char *src,n)
strlen計算字串長度。到『\0結束』
1.++i
int & int::operator++()
2.i++ (返回應是常量!)
constintint::operator++(int
)
1. 指標有分配空間(大小是4個位元組),引用沒有(sizeof大小為引用物件的大小)
2. 指標初始化為null(nullptr),引用必須初始化為乙個已有物件的引用。
3.引數傳遞時,指標需要解引用(*)才可以對物件操作,引用則可以直接修改。
4.指標在使用中可以改變指向的物件,但引用僅是別名,不能改變。
5.可以有多級指標,但引用只有一級(&&為右值引用)
new/delete是c++關鍵字,而malloc/fre是c語言庫函式。
new是先分配記憶體,再構造物件,然後將物件繫結到記憶體的位址上。
delete是先析構物件,再釋放記憶體。
malloc和free僅對記憶體操作,不使用構造/析構函式。
四個智慧型指標為:shared_ptr,weak_ptr,unique_ptr,auto_ptr,前三個c++11支援
智慧型指標原理:智慧型指標為乙個類,超出類作用域後,類會子懂呼叫析構函式,析構函式則會自動釋放資源。
所以智慧型指標即在函式結束時自動釋放記憶體空間,不需要手動釋放。
1. shared_ptr
多個該智慧型指標可以指向相同物件,該物件和其相關資源在最後乙個引用被銷毀時釋放。
通過use_count()檢視資源所有者個數。可以通過new來構造,也可以傳入其他智慧型指標構造。
呼叫release()時,可以手動釋放資源所有權,且引用計數減一,當計數為0時資源被釋放。
使用make_shared()或建構函式可以傳入普通指標,或者通過get函式獲取普通指標。
成員函式:
use_count() 返回引用計數
unique 返回是否獨佔(即引用計數為1)
reset() 放棄物件的所有權
2. unique_ptr(替換auto_ptr)
同一時間只有乙個智慧型指標可以指向該物件。
不能將乙個unique_ptr賦值給另乙個,但如果源unique_ptr為乙個右值則可以賦值。
3. weak_ptr
weak_ptr不控制物件生命週期,指向share_ptr管理的物件,僅是一種訪問手段,但不會引起引用計數的增加或減少,是一種弱引用,不能訪問物件的成員函式,需要通過lock()轉化為shared_ptr才可以。
expired() 若use_count為0則返回true,否則返回false
lock() 返回物件的shared_ptr,不存在則返回空shared_ptr。
智慧型指標主要用於管理在堆上分配的記憶體,將普通指標封裝成棧物件。當棧物件生存週期結束後,在析構函式中釋放申請的記憶體,防止記憶體洩漏。
在兩個shared_ptr成員變數指向對方時會造成迴圈引用,使引用計數失效,從而導致記憶體洩漏。為了解決這個問題,使用weak_ptr可以解決這個問題,weak_ptr不會修改引用計數,從而避免無法訪問。
主要實現引用計數,什麼時候銷毀底層指標,賦值和拷貝構造時引用計數變化。
參考:儲存:底層真實指標,使用指標儲存引用計數。
建構函式:
templateshared_ptr::shared_ptr(t *p):ptr(p),use_count(new_int(1))
拷貝建構函式
templateshared_ptr::shared_ptr(const shared_ptr&orig)
過載=運算子
當賦值後,需要判斷原物件的引用計數。templateshared_ptr
& shared_ptr::operator=(const shared_ptr&rhs)
ptr=rhs.ptr;
*use_count=*(rhs.use_count);
return *this;}
return *this;
}
析構函式
templateshared_ptr::~shared_ptr()}
指向乙個具體函式的指標變數。每乙個函式都有乙個入口位址,該入口位址就是函式指標指向的位址,可以使用該指標變數呼叫函式。
#include
#include
pid_t fork(void);
呼叫fork()會建立乙個新程序。在子程序中fork呼叫返回的是0,父程序返回子程序的pid,如果錯誤則返回負值。
在呼叫fork()後,可以使用exec()載入二進位制映像來替換當前程序的映像。
在linux中對程序內部結構採用寫時複製的方法,而不是將父程序整體複製。(需要查閱)
在gcc下使用attribute宣告多個constructor、destructor
__attribute((constructor))voidbefore()
當物件結束生命週期時,系統自動執行析構函式。乙個類只能有乙個析構函式,不能過載。
如果不編寫析構函式,則無法**動態分配的記憶體。
析構順序 類本身的析構函式->物件成員的析構函式->基類析構函式
靜態函式在編譯時就已經確定執行時機,而虛函式則在執行時動態繫結。
虛函式使用虛函式表機制,呼叫時會增加一次記憶體開銷
過載:兩個函式名相同,但引數列表不同,在同乙個作用域內。
重寫:子類繼承父類,父類中函式時虛函式,在子類中重新定義了這個函式。
c++呼叫c函式需要extern c,因為c語言沒有過載。
隱藏:1.子類函式與父類函式的函式名相同,引數不同,不管父類是不是虛函式,都隱藏。
2.子類函式與父類函式名和引數都相同,但父類不是虛函式。
用在多重繼承中,防止繼承乙個類兩次:例如,類a派生類b,類c,d同時繼承b和c,此時就需要使用虛繼承防止繼承a兩次。
多型分為靜態多型和動態多型。
靜態多型指函式過載,在編譯時確定。
動態多型指虛表指標指向的虛表中的虛函式不同,執行時表現出來。
虛函式的實現:有虛函式的類中,類最開始的部分是乙個虛函式表的指標,指標指向乙個虛函式表,表中存放虛函式的位址,當子類繼承父類時也會繼承續函式表。當子類重寫父類中虛函式時,會將其繼承到的虛函式表中的位址替換為重寫的函式位址。使用虛函式會增加訪問記憶體開銷
析構函式必須是虛函式,為了保證建立乙個子類,父類指標指向該物件時,釋放基類指標可以釋放掉子類的空間,防止記憶體洩漏。
只有要當做父類時虛函式才需要,而虛函式則需要生成額外的虛函式表及虛指標占用額外記憶體,對於不會被繼承的類來說則會浪費記憶體。
在呼叫時首先將實參傳遞給形參,傳遞過程需要呼叫拷貝建構函式,如此會迴圈爆棧。
C 基本知識整理(1)
在c 程式設計中using namespace std 這條語句很常見,其中,namespace就是命名空間,而using是宣告,std是命名空間名。命名空間就是為了解決c 中函式變數的命名衝突所採取的一種措施,能夠解決多模組協同開發出現變數函式命名的衝突問題。1 using宣告及作用域 using...
C 基本知識整理(2)
1 建構函式 c 中定義了一種特殊的初始化函式,稱為建構函式 當物件被呼叫時,建構函式自動呼叫 建構函式名字與類名相同,也沒有返回型別和返回值 物件在生成過程中通常需要初始化變數或分配動態記憶體,用建構函式。程式中可以沒有建構函式,這時會執行乙個空的建構函式。下面來看建構函式例項 include u...
javascript基本知識整理三
全域性變數 定義在外邊的變數 若沒有用var宣告,則當這行賦值執行,則就將他認為是全域性變數。區域性變數 在函式內部裡宣告的變數,只能在該函式裡有效。bom物件 window物件的方法 prompt alert confirm close open settimeout setinterval cl...