新聞中心
在C++編程語(yǔ)言中,對(duì)于內(nèi)存的操作是一個(gè)非常重要的應(yīng)用技術(shù),作為程序員來(lái)說(shuō),必須要清楚這方面的應(yīng)用。在這里我們先來(lái)介紹一下C++內(nèi)存使用機(jī)制的相關(guān)概念,希望能給大家?guī)?lái)一些幫助。#t#

創(chuàng)新互聯(lián)自2013年起,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元壽寧做網(wǎng)站,已為上家服務(wù),為壽寧各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
1.程序使用內(nèi)存區(qū)
一個(gè)程序占用的內(nèi)存區(qū)一般分為5種:
(1)全局、靜態(tài)數(shù)據(jù)區(qū):存儲(chǔ)全局變量及靜態(tài)變量(包括全局靜態(tài)變量和局部靜態(tài)變量)
(2)常量數(shù)據(jù)區(qū):存儲(chǔ)程序中的常量字符串等。
(3)代碼區(qū):存儲(chǔ)程序的代碼。
(4)棧:存儲(chǔ)自動(dòng)變量或者局部變量,以及傳遞的函數(shù)參數(shù)等。
(5)堆:存儲(chǔ)動(dòng)態(tài)產(chǎn)生的數(shù)據(jù)。
在處理內(nèi)存時(shí),系統(tǒng)會(huì)自動(dòng)將內(nèi)存對(duì)齊,這樣雖然會(huì)浪費(fèi)一些內(nèi)存,但由于CPU在對(duì)齊方式下運(yùn)行比較快,所以一般都是對(duì)程序性能還是有好處的。
一個(gè)程序使用的棧的大小是固定的,由編譯器決定。一般是1MB。棧的內(nèi)存是系統(tǒng)自動(dòng)分配的,壓棧和出棧都有相應(yīng)的指令進(jìn)行操作。因此效率較高,并且分配的內(nèi)存空間是連續(xù)的,不會(huì)產(chǎn)生內(nèi)存碎片;而堆上的內(nèi)存是由開(kāi)發(fā)人員來(lái)動(dòng)態(tài)分配和回收的。在分配內(nèi)存時(shí),系統(tǒng)需要按照一定的算法在堆空間中尋找合適大小的空閑堆,并修改相應(yīng)的維護(hù)堆空閑空間的鏈表,然后返回地址給程序。因此效率比棧要低,此外還容易產(chǎn)生內(nèi)存碎片。
從C++對(duì)象模型的角度來(lái)說(shuō),對(duì)象就是C++內(nèi)存使用機(jī)制中的一片區(qū)域。如果一個(gè)對(duì)象通過(guò)定義在某個(gè)函數(shù)內(nèi)的變量或者實(shí)現(xiàn)需要的臨時(shí)變量來(lái)創(chuàng)建時(shí),它是棧上的一個(gè)對(duì)象;如果一個(gè)對(duì)象是定義在全局范圍內(nèi)的變量,則它是存儲(chǔ)全局/靜態(tài)數(shù)據(jù)區(qū);如果一個(gè)對(duì)象是通過(guò)new操作符來(lái)創(chuàng)建時(shí),它是堆上的一個(gè)對(duì)象。
2.對(duì)象的生命周期
(1)通過(guò)定義變量創(chuàng)建對(duì)象:在這種情況下,變量的作用域決定了對(duì)象的生命周期。當(dāng)進(jìn)入變量的作用域時(shí),對(duì)象被創(chuàng)建。而退出變量的作用域時(shí),對(duì)象被銷毀。值得注意的是靜態(tài)變量和全局變量,由于全局變量的作用域是整個(gè)程序,因此被聲明為全局變量的對(duì)象在程序調(diào)用main()函數(shù)之前被創(chuàng)建。當(dāng)程序退出main()函數(shù)之后,全局對(duì)象才被銷毀。靜態(tài)對(duì)象與全局對(duì)象類似,雖然靜態(tài)變量的作用域不是整個(gè)程序,但靜態(tài)變量是存儲(chǔ)在全局/靜態(tài)數(shù)據(jù)區(qū)中,在程序開(kāi)始時(shí)已經(jīng)分配好。因此聲明為靜態(tài)變量的對(duì)象第一次進(jìn)入作用域時(shí)被創(chuàng)建,直到程序退出時(shí)被銷毀。
(2)通過(guò)new操作符創(chuàng)建對(duì)象:這種情況相對(duì)比較簡(jiǎn)單,但也最容易造成內(nèi)存泄漏。通過(guò)new創(chuàng)建的對(duì)象會(huì)一直存在,直到被delete銷毀。即使指向該對(duì)象的指針(一般都是自動(dòng)變量)已被銷毀,但還沒(méi)有調(diào)用delete,該對(duì)象就會(huì)一直存在。即占據(jù)內(nèi)存空間,直到程序退出,因此也就造成內(nèi)存泄漏。
(3)通過(guò)實(shí)現(xiàn)創(chuàng)建對(duì)象:這種情況一般是指一些隱藏的中間臨時(shí)變量的創(chuàng)建和銷毀。它們的生命周期很短,也不容易被開(kāi)發(fā)人員發(fā)覺(jué)。但常常是造成程序性能下降的瓶頸,尤其是對(duì)于那些占用內(nèi)存較多,創(chuàng)建速度較慢的對(duì)象。這些臨時(shí)對(duì)象一般是通過(guò)copy constructor創(chuàng)建的。在實(shí)際開(kāi)發(fā)中,通過(guò)值傳遞傳遞參數(shù),重載+及++等操作符,對(duì)對(duì)象進(jìn)行算術(shù)運(yùn)算時(shí),也會(huì)有臨時(shí)對(duì)象,對(duì)于這些情況,都要盡量避免不必要的臨時(shí)對(duì)象的出現(xiàn)。
3.C++對(duì)象的內(nèi)存布局
(1)非靜態(tài)數(shù)據(jù)成員是影響對(duì)象占據(jù)內(nèi)存大小的主要因素,隨著對(duì)象數(shù)目的增加,非靜態(tài)數(shù)據(jù)成員占據(jù)的內(nèi)存會(huì)相應(yīng)增加。
(2)所有的對(duì)象共享一份靜態(tài)數(shù)據(jù)成員,所以靜態(tài)數(shù)據(jù)成員占據(jù)的內(nèi)存的數(shù)量不會(huì)隨著對(duì)象數(shù)目的增加而增加。
(3)靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)不會(huì)影響對(duì)象內(nèi)存的大小,雖然其實(shí)現(xiàn)會(huì)占據(jù)相應(yīng)的C++內(nèi)存使用機(jī)制空間,同樣也不會(huì)隨著對(duì)象數(shù)目的增加而增加。
(4)如果對(duì)象中包含虛函數(shù),會(huì)增加4個(gè)字節(jié)的空間(虛函數(shù)表指針),不論有多少個(gè)虛函數(shù)。
本文標(biāo)題:C++內(nèi)存使用機(jī)制基本概念詳解
當(dāng)前URL:http://fisionsoft.com.cn/article/coieeoo.html


咨詢
建站咨詢
