對第一次接觸到c++語言的使用者和學者來說,了解c++語言的概念是非常重要的,那麼就先說一下什麼是c++語言,所謂c++語言:是一種使用非常廣泛的計算機程式語言。
c++為我們所提供的各種訪問控制僅僅是在編譯階段給我們的限制,也就是說是編譯器確保了你在完成任務之前的正確行為,如果你的行為不正確,那麼你休想構造出任何可執行程式來。
但如果真正到了產生可執行**階段,無論是c,c++,還是pascal,大家都一樣,你認為c和c++編譯器產生的機器**會有所不同嗎,你認為c++產生的機器**會有訪問限制嗎?那麼你錯了。什麼const,private,統統沒有(const變數或許會放入唯讀資料段),它不會再給你任何的限制,你可以利用一切記憶體修改工具或者是自己寫乙個程式對某一程序空間的某一變數進行修改,不管它在你的印象中是private,還是public,對於此時的你來說都一樣,想怎樣便怎樣。
另外,你也不要為c++所提供的什麼晚期**等機制大呼神奇,它也僅僅是在所產生的**中多加了幾條而已,它遠沒有你想象的那麼智慧型,所有的工作都是編譯器幫你完成,真正到了執行的時候,計算機會完全按照編譯器產生的**一絲不苟的執行。
(以下的反彙編**均來自visial c++ 7.0)
一.讓我們從變數開始-----並非你想象的那麼簡單
變數是什麼,變數就是乙個在程式執行過程中可以改變的量。換乙個角度,變數是一塊記憶體區域的名字,它就代表這塊記憶體區域,當我們對變數進行修改的時候,會引起記憶體區域中內容的改變。
按照我們的思維習慣來講,就是「存在乙個變數a,它的值是10」,一切都顯得那麼的自然。我們不必去在乎什麼所謂的位址以及其他的一些細節。然而在這條語句的底層實現中,a已經不能算是乙個變數了,它僅僅是乙個標記,代表乙個位址的標
看過了第一條,你一定對編譯器的工作有了一定的了解,實際上編譯器就是程式設計師與底層之間的乙個轉換層,它把乙個高階語言**轉換為低階語言**,乙個編譯器完成的轉換跨度越大,那麼它也就會越複雜。
因為程式設計師的工作都由他代為完成了。c++編譯器必然比彙編編譯器複雜就是這個道理。如果我問你引用和指標是一樣的嗎?你或許會說當然不一樣了,指標容易產生不安全的因素,引用卻不會,真的不會嗎?我們來看下面這段**,
我個人認為,所謂的引用其實就是一種指標,只不過二者的介面並不相同,引用的介面有一定的限制。指標可以一對多,而引用卻只能一對一,即&refer不能被改變,但卻並不能說一對一就是安全的,只不過危險的係數降低罷了。引用比指標更容易控制。
C 虛函式機制解析
這個例項的記憶體中,所以,當我們用父類的指標來操作乙個子類的時候,這張虛函式表就顯得由為重要了,它就像乙個地圖一樣,指明了實際所應該呼叫的函式。include iostream using namespace std class base virtual void g virtual void h ...
slab機制解析
2 原始碼解讀 slab是linux在夥伴系統之上的一種記憶體管理機制。夥伴系統最小的記憶體處理大小為4k 即一頁的記憶體大小 然而,實際使用記憶體過程中,很多都是小記憶體,為了提高記憶體申請釋放效率 防止記憶體碎片的產生 防止記憶體連續分配導致cpu快取命中率低,linux在夥伴系統之上設計出sl...
預解析機制
js在預解析階段先找所有宣告,如果是var 先給var後的變數定乙個undefind 如果是function 就把function當做字元創賦給函式名 如果名字形同的情況function會把覆蓋var 後面function會覆蓋前面function 1.定義 預解析 在當前作用域下,js執行之前,會...