又有一段時間沒寫筆記了,最近放下了老師那邊的專案,原因很簡單:做自己想做的事就好。
如果做一件自己不感興趣的事,總是力不從心,效率太低,所以我是還是繼續我的c++學習之旅,回到正題。。。
1.通過定義變數建立物件
2.臨時物件的建立
3.動態建立物件(new)
建立的方式不同,他們的生命週期也就不同,而生命週期由作用域決定,就第一種而言,可細分為全域性、靜態、區域性物件
全域性、靜態物件建立於編譯時期,同整個程式的生命週期相同,但是全域性物件的作用域為整個程式,而靜態物件不是,但
它們都是儲存在全域性/靜態資料區中
然後,區域性物件與臨時物件都是存在於棧中,什麼是臨時物件?就是不在原始碼級的物件,還不懂?ok,上例子:
在類中一般都會隱含預設拷貝建構函式,當我們要呼叫乙個函式,而該函式的形參為類的一般物件,就像這樣:
string getname(student s);
其中student為乙個類
當我們呼叫該函式:string name = getname(student);
student為乙個student的物件
傳遞給s的不是student物件本身而是它的乙個副本,這也就會呼叫預設拷貝建構函式來建立乙個臨時物件,而這個建立過程並沒有在原始碼裡顯現出來
像這種方式產生的物件都是臨時物件,所以啊。。。應該盡量地杜絕產生臨時物件,你想啊,要是要傳遞的物件很大,或者是在派生的最底端,臥槽...那就悲劇了,不僅耗時、耗記憶體,還容易造成記憶體洩露,辦法呢?可以用應用嘛。扯遠了。。。
一看到new,自然很熟悉,前面講過動態建立的物件或變數存放在堆中,它的生命週期自然在delete後才結束,或者在程式結束後,暴力的了結它
談到記憶體分布,物件所佔記憶體的大小也是個好奇的問題,舉個例子:
class student ;
這個類可以說已經很豐富了,它既有靜態變數、非靜態變數、虛函式、靜態函式...
那這個類的乙個物件占多大記憶體呢,你用sizeof()看下是12個位元組,如何得之?
age是4個位元組,然後name本來是乙個位元組,但是為了和age對其,也將它擴充為4個位元組,然後id是靜態成員變數,儲存在全域性/靜態資料區,不算在物件所佔記憶體中。然後就剩下了那些函式,其中還隱含了一些預設函式,一眼看去這些函式肯定不止4個位元組,然後我就乙個個地將函式刪除,看會不會影響它的大小,終於在將虛函式刪除後,它的大小變成了8個位元組,當時我還猜測是不是和函式的返回型別有關呢,其實錯了,其實這4個位元組是乙個指標所佔的空間,乙個指向虛函式表的指標,所以不管你類中有多少個虛函式,只會有乙個這樣的指標,而已派生類中虛函式也共用這個指標,但其他的函式不佔空間嗎?其實,這些函式在編譯後,只是將它們的函式名「加以修飾」,以前說過的函式過載就是根據修飾後的函式名而確定。所以..謎團解除了。
當然此後的子類物件的記憶體大小和上述的規則差不多,自己可以去試試看,只有了解了物件在記憶體中的管理,你才能很好將乙個程式進行優化,使它盡可能地少重複開闢空間和釋放空間。先說到這裡了。。。
工欲善其事,必先利其器
C 學習 物件模型之類及物件記憶體模型
使用c 開發一年多,從今天開始系統性的總結下c 一些知識點,畢竟c 語言特性複雜而龐大,很難短時間全部掌握。首先類可以模擬c語言的struct結構體,單純的宣告乙個類a,如果a沒有被例項化,那麼a是不會占用記憶體空間。這裡的類可以理解為一種特殊資料結構型別。再來談談物件,乙個類例項化後就變成乙個物件...
物件導向之類和物件
什麼是面向過程與物件導向?面向過程 再說乙個,專案經理與員工 經理要完成乙個專案,就跟員工說 把這個專案做出來。經理要把做專案這件事交個員工來完成,這個員工就是經理面向的物件。員工需要去想怎麼一步步吧專案做出來,這個員工面向的就是過程。總的來說,面向過程與物件導向只是乙個做一件事的思維。去做一件事,...
python物件導向之類,物件
類別,乙個是抽象概念 小a的朋友們 是一些列具備相同特徵和相同行為的物件的集合 就是具體操作的某個事物,具備自己的特徵和行 小a的朋友 小明 類包含一系列物件 物件屬於某個類 在現實中先有物件,再有類 在程式中是,先有類,才能有物件 而在程式中是先有類才能物件,我們必須先告訴計篡機這類的物件有什麼特...