知識梳理

1、C++php

內存管理html

1. 內存分配區域node

棧、堆、自由存儲區、全局區、常量區。linux

[常量數據(const data)區:]

 常量數據區存儲字符串等在編譯期間就能肯定的值。類對象不能存在於這個區域中。在程序的整個生存週期內,區域中的數據都是可用的。

   區域內全部的數據都是隻讀的,任何企圖修改本區域數據的行爲都會形成沒法預料的後果。之因此會如此,是由於在實際的實現當中,即便是最底層的內部存儲格式也受制於所實現的特定的優化方案。例如,一種編譯器徹底能夠把字符串存放在幾個重疊的對象裏面――只要實現者願意的話。  

[棧(stack)區:]

   棧區存儲自動變量(automatic variables)。通常來講,棧區的分配操做要比動態存儲區(好比堆(heap)或者自由存儲區(free store))快得多,這是由於棧區的分配只涉及到一個指針的遞增,而動態存儲區的分配涉及到較爲複雜的管理機制。棧區中,內存一旦被分配,對象就當即被構造好了;對象一旦被銷燬,分配的內存也當即被收回(譯註:這裏做者用了「去配(deallocate)」一詞,鄙人一概翻譯爲「回收」)。所以,在棧區中,程序員沒有辦法直接操縱那些已經被分配但尚未被初始化的棧空間(固然,那些經過使用顯式(explicit)析構函數(destructor)和new運算符而故意這麼作的狀況不算在內)。

[自由存儲區(free store):]

   自由存儲區(free store)是C++兩個動態內存區域之一,使用new和delete來予以分配和釋放(freed)。在自由存儲區(free store)中,對象的生存週期能夠比存放它的內存區的生存週期短;這也就是說,咱們能夠得到一片內存區而不用立刻對其進行初始化;同時,在對象被銷燬以後,也不用立刻收回其佔用的內存區。在對象被銷燬而其佔用的內存區還未被收回的這段時間內,咱們能夠經過void*型的指針訪問這片區域,可是其原始對象的非靜態成員以及成員函數(即便咱們知道了它們的地址)都不能被訪問或者操縱。

[堆(heap)區:]

    堆(heap)區是另外一個動態存儲區域,使用malloc、free以及一些相關變量來進行分配和回收。要注意,雖然在特定的編譯器裏缺省的全局運算符new和delete也許會按照malloc和free的方式來被實現,可是堆(heap)與自由存儲區(free store)是不一樣的――在某一個區域內被分配的內存不可能在另外一個區域內被安全的回收。堆(heap)中被分配的內存通常用於存放在使用new的構造過程當中和顯式(explicit)的析構過程當中涉及到的類對象。堆中對象的生存週期與自由存儲區(free store)中的相似。

[全局/靜態區(Global/Static):]

   全局的或靜態的變量和對象所佔用的內存區域在程序啓動(startup)的時候才被分配,並且可能直到程序開始執行的時候才被初始化。好比,函數中的靜態變量就是在程序第一次執行到定義該變量的代碼時才被初始化的。對那些跨越了翻譯單元(translation unit)的全局變量進行初始化操做的順序是沒有被明肯定義的,於是須要特別注意管理全局對象(包括靜態類對象)之間的依賴關係。最後,和前面講的同樣,全局/靜態區(Global/Static)中沒有被初始化的對象存儲區域能夠經過void*來被訪問和操縱,可是隻要是在對象真正的生存週期以外,非靜態成員和成員函數是沒法被使用或者引用的。
View Code

若是細分的話,malloc的在堆上,new的在自由存儲區。詳細參考ref10.git

因此,通常的局部變量、函數參數都是在棧上,new分配的在堆上,malloc分配的在自由存儲區,static靜態變量和全局變量在全局/靜態存儲區,字面常量在常量區。程序員

須要注意的是,不少文章(包括底下的ref) 在整理的時候說還有代碼段、數據段,這不是一個概念。詳見此貼。代碼段、數據段、棧是CPU級別的邏輯概念,堆是語言級別的邏輯概念。github

代碼段、數據段、堆棧段,這是一個概念。 (參考 APUE ch7.6 & ref11)(這兩個講的都很好)算法

數據段分爲未初始化數據段(BSS)和初始化數據段。其中未初始化數據段(BSS)裏存放未初始化的全局變量,初始化數據段裏存放已初始化的全局變量。

堆、棧、全局區、常量區,這是另外一個概念。(細分的話能夠加上自由存儲區)設計模式

ref1:Exceptional C++ Item35         ref2       ref3        ref4       ref5       ref6       ref7      ref8        ref9   ref10      (有不少重合內容。主要看不重合的部分。)                                                                                                                                                  安全

語言基礎

 1. 虛函數和純虛函數    ref     ref2      ref3                【這幾篇ref都很好,包括例子也都看一下】

 2. 虛函數表     ref    ref2                               

 3. C++接口與實現分離    ref

 4. 內存對齊    ref    ref2

 5. 理解複雜的C/C++聲明   ref

 

Effective C++

1. 理解接口繼承規則     ref

 

STL

 

庫函數

 

2、數據結構

常見算法、數據結構複雜度 http://bigocheatsheet.com/

關於樹(2-3樹,紅黑樹,B樹,B+樹):

紅黑樹是對2-3樹的一種簡單版的實現;

B樹是對2-3樹的擴展(從要求每一個節點有2-3個子樹擴展到能夠有m個);

B+樹是對B樹的進一步擴展(

1. 內部節點不存儲鍵值關聯的附屬數據,因此內部節點節省的空間能夠存放更多的鍵值。也就意味着從磁盤存取一頁時可得到更多的鍵值信息。
2. 葉節點造成了一個鏈,因此對樹的全掃描就是對全部葉節點的線性遍歷。
B+樹相對於B樹的優點:

 

1. 紅黑樹

紅黑樹本質上是二叉查找樹,但它在二叉查找樹的基礎上增長了着色和相關的性質使得紅黑樹相對平衡,從而保證了紅黑樹的查找、插入、刪除的時間複雜度最壞爲O(log n)

2. B樹

3、操做系統

1. Unix文件系統/inode

ref: 鳥哥的私房菜 第8章 Linux磁盤與文件系統管理 

 

 

4、設計模式

1. C++單例模式寫法? 如何定義一個只能在堆上定義對象的類?棧上呢?

 

5、海量數據相關

http://blog.csdn.net/v_july_v/article/details/7382693

 

hadoop

1. 簡單例子,如wordCount等

ref

相關文章
相關標籤/搜索