精通windows api:
1.文件系統:
卷(volumes)
磁盤和驅動器管理: 操作驅動器掛載點
文件和目錄管理: 獲取程序所在的目錄,程序模塊路徑,獲取和設置當前目錄
查找文件,遍歷指定目錄下的文件和子目錄
遞歸遍歷目錄樹
獲取,設置文件屬性和時間
內存映射文件: 使用Mapping File提高文件讀寫的效率
通過Mapping File在進程間傳遞和共享數據
2.內存管理:
虛擬地址空間: 爲了訪問內存的統一和方便,操作系統允許其上運行的程序訪問所有的4GB內存空間中的地址;
進程的內存空間: 32位的window操作系統將4GB的虛擬內存劃分爲兩個部分,進程使用2GB,稱爲用戶進程空間;內核使用2GB,稱爲系統地址空間或內核地址空間(也可設置爲用戶進程空間使用3GB,內核使用1GB),用戶空間的地址範圍爲0x00000000~0x7FFFFFFF,內核空間的地址範圍爲0x80000000~0xFFFFFFFF
分頁與分段內存管理,內存映射與地址轉換: 32位地址的高10位稱爲頁目錄索引(Directory),次10位稱爲頁表索引(Table),餘下的12位爲偏移(Offset)
進程的內存空間: 虛擬內存與物理內存的對應關係window系統中每個進程都有一個私有的虛擬地址空間,系統需要將每個進程的虛擬地址都映射到物理內存地址上;系統爲每一個進程都創建一個頁目錄(Directory)和一組頁表;每個進程的頁表是獨立的,而內核空間的頁表是所有進程共享的
虛擬內存佈局,內存的分工,堆與棧: 進程的虛擬內存空間分爲兩個部分,低2GB(或3GB)由應用程序使用,高2GB(或1GB)由系統內核程序使用;系統內核的內存空間中包括驅動程序,系統內核可執行程序,用於內存管理的數據結構(頁目錄,頁表等),用於進程管理,線程調度的數據結構,各種中斷處理程序,系統緩存等; 應用程序可使用的低地址空間中包括了應用程序的代碼,數據(全局變量等),系統和用戶DLL的代碼,各線程的棧,堆等; 進程的每個線程都有自己的棧,棧與函數的調用,執行和返回及局部變量的保存有關,一般情況下,棧中保存着函數的參數,返回地址和局部變量,調用函數將參數入棧,調用指令將函數返回地址入棧,被調用函數負責保存調用函數的相關棧指針,爲局部變量分配空間等; 堆是一種可以動態分配和釋放的內存,由堆管理器進行管理,用戶在程序中使用的內存分配函數都是通過堆進行分配的
堆管理: 用戶使用內存分配函數分配的內存都位用堆中,所以使用堆管理函數對內存進行分配,釋放等是最爲直接的方式;Window系統中,每個進程都有自己的堆,每個進程的堆的數量也有所不同;堆(Heap)並不是內存塊,而是一種用於內存管理的對象,也是一種內存組織的形式;
虛擬內存管理:進程的虛擬地址空間內存頁面分爲3種狀態:空閒的(free),保留的(reserved)和提交的(committed); 如果直接分配內存爲"提交的",那麼在分配完成後就可以對內存進行訪問
內存操作與內存信息管理:CopyMemory, FillMemory, MoveMemory, ZeroMemory
C++ primer plus:
類內存分配(C,C++技術交流羣):
class A
{}
類大小爲1,編譯器爲空類加入一個char,使類在內存中有個唯一的地址,不是空類時,就不會加
class A
{
char a;
int b;
char c;
}
大小爲12
class A
{
char a;
char b;
int c;
}
類大小爲:8
class A
{
char a;
int b;
double c;
}
類大小爲16
class A
{
char a;
double b;
int c;
}
類大小爲24
以上爲類的內存地址對齊方式;
const Stock& topval ( const Stock& s)const
括號中的const表明,該函數不會修改被顯式地訪問的對象;
括號後的const表明,該函數不會修改被隱式地訪問的對象;
由於該函數返回了兩個const對象之一的引用,因此返回類型也應爲const引用;
數據結構:
串:
KMP算法:暈了幾天,還是沒搞懂;最後,大概弄懂了意思,只是沒從代碼角度去理解;
中綴表達式,後綴表達式
遞歸兩個條件:一是規模較大的問題能分解成爲一個或多個規模較小,但具有類似於原問題特性的子問題,即較大的問題可用較小的子問題來描述,解原問題的方法同樣可用來解這些子問題,如有必要,這種分解可以繼續下去;二是存在一個或多個無須分解,可直接求解的最小子問題;前者稱爲遞歸步驟,後者稱爲終止條件;(典型:漢諾塔)