allocator引起的觀念變化
接觸allocator,你可以體會(huì)到了它與C++傳統(tǒng)的new/delete觀念的不同。這主要有以下幾點(diǎn):
1. 每個(gè)類(或者算法)本身,均有最合適它的內(nèi)存管理機(jī)制,并不是向C++傳統(tǒng)的做法那樣,使用一個(gè)全局的new/delete。也許你會(huì)說(shuō),C++不也允許一個(gè)類定義自己的new和delete嗎?是的,C++的確支持類定義自己的new/delete,但注意,它的理念和allocator完全不同。我不認(rèn)為它是C++的一個(gè)優(yōu)秀之作,相反,它起到了誤導(dǎo)作用。
因?yàn)?,決定一個(gè)類對(duì)象怎么去new出來(lái),并不是取決于該類本身,而相反是取決于使用該類的人。一個(gè)類不需要關(guān)心自身被如何創(chuàng)造出來(lái),更不能假定。它需要關(guān)心的是它自己的類成員如何被創(chuàng)建出來(lái),它的算法(你可以把類看做一個(gè)算法集合)涉及到的所有組件如何被創(chuàng)建出來(lái)。而這,才是allocator帶來(lái)的觀念。
讓各種各樣的allocator創(chuàng)建同一個(gè)類的不同實(shí)例,這些實(shí)例甚至可能在一起工作,相互協(xié)作。從STL的角度講,這完全是最正常不過(guò)的事情了。
2. 重要的是由allocator創(chuàng)建管理對(duì)象,避免在你的代碼中使用new/delete。如果可能,你可以如STL那樣,將allocator作為模板參數(shù),不綁定具體的某個(gè)內(nèi)存管理器。但是,如果你的算法依賴了某個(gè)allocator的實(shí)現(xiàn)特有的功能,這也并不要緊。你的目的不是要做到allocator的可替換,不是嗎?重要的是使用了這個(gè)allocator了,它給你在內(nèi)存管理上帶來(lái)了益處。
但是,應(yīng)該看到,STL實(shí)作的各種allocator,目前來(lái)看除了最簡(jiǎn)單使用malloc/free實(shí)現(xiàn)的外,主要就是基于mempool技術(shù)。而該技術(shù)的目標(biāo),不是讓內(nèi)存使用者更加方便有效地進(jìn)行內(nèi)存管理,而更多的是關(guān)注于內(nèi)存分配的時(shí)間性能。為了讓C++程序員從內(nèi)存管理中解脫出來(lái),我們需要實(shí)作新的alloctor,需要新的突破!
新視角:具垃圾回收能力的Allocator
對(duì),我設(shè)想的一個(gè)做法是,貫徹STL的allocator觀念,并且提供具備特定的內(nèi)存管理能力(例如垃圾回收)的各種allocator。讓C++社區(qū)廣泛接受allocator觀念,并且從中受益。C++程序員是時(shí)候拋棄傳統(tǒng)的new/delete,讓他們退出歷史舞臺(tái)了。
我接下來(lái)會(huì)實(shí)作兩個(gè)具體的allocator(均屬原創(chuàng))。相信它們會(huì)讓你耳目一新,讓你不禁想到:哦,原來(lái)在C++中,我還可以這樣進(jìn)行內(nèi)存管理。
當(dāng)然,我的希望就是,這兩個(gè)allocator能夠起到拋磚引玉的作用,讓大家也清楚地意識(shí)到allocator的重要性,可以出現(xiàn)更多的具備各種能力的allocator,解脫C++程序員一直以來(lái)的苦難(可能是苦難)。
這兩個(gè)allocator均具備一定程度的垃圾回收能力。只是觀念上各有各的側(cè)重。我們接下來(lái)會(huì)分為兩個(gè)專題專門對(duì)它們進(jìn)行闡述。
接觸allocator,你可以體會(huì)到了它與C++傳統(tǒng)的new/delete觀念的不同。這主要有以下幾點(diǎn):
1. 每個(gè)類(或者算法)本身,均有最合適它的內(nèi)存管理機(jī)制,并不是向C++傳統(tǒng)的做法那樣,使用一個(gè)全局的new/delete。也許你會(huì)說(shuō),C++不也允許一個(gè)類定義自己的new和delete嗎?是的,C++的確支持類定義自己的new/delete,但注意,它的理念和allocator完全不同。我不認(rèn)為它是C++的一個(gè)優(yōu)秀之作,相反,它起到了誤導(dǎo)作用。
因?yàn)?,決定一個(gè)類對(duì)象怎么去new出來(lái),并不是取決于該類本身,而相反是取決于使用該類的人。一個(gè)類不需要關(guān)心自身被如何創(chuàng)造出來(lái),更不能假定。它需要關(guān)心的是它自己的類成員如何被創(chuàng)建出來(lái),它的算法(你可以把類看做一個(gè)算法集合)涉及到的所有組件如何被創(chuàng)建出來(lái)。而這,才是allocator帶來(lái)的觀念。
讓各種各樣的allocator創(chuàng)建同一個(gè)類的不同實(shí)例,這些實(shí)例甚至可能在一起工作,相互協(xié)作。從STL的角度講,這完全是最正常不過(guò)的事情了。
2. 重要的是由allocator創(chuàng)建管理對(duì)象,避免在你的代碼中使用new/delete。如果可能,你可以如STL那樣,將allocator作為模板參數(shù),不綁定具體的某個(gè)內(nèi)存管理器。但是,如果你的算法依賴了某個(gè)allocator的實(shí)現(xiàn)特有的功能,這也并不要緊。你的目的不是要做到allocator的可替換,不是嗎?重要的是使用了這個(gè)allocator了,它給你在內(nèi)存管理上帶來(lái)了益處。
但是,應(yīng)該看到,STL實(shí)作的各種allocator,目前來(lái)看除了最簡(jiǎn)單使用malloc/free實(shí)現(xiàn)的外,主要就是基于mempool技術(shù)。而該技術(shù)的目標(biāo),不是讓內(nèi)存使用者更加方便有效地進(jìn)行內(nèi)存管理,而更多的是關(guān)注于內(nèi)存分配的時(shí)間性能。為了讓C++程序員從內(nèi)存管理中解脫出來(lái),我們需要實(shí)作新的alloctor,需要新的突破!
新視角:具垃圾回收能力的Allocator
對(duì),我設(shè)想的一個(gè)做法是,貫徹STL的allocator觀念,并且提供具備特定的內(nèi)存管理能力(例如垃圾回收)的各種allocator。讓C++社區(qū)廣泛接受allocator觀念,并且從中受益。C++程序員是時(shí)候拋棄傳統(tǒng)的new/delete,讓他們退出歷史舞臺(tái)了。
我接下來(lái)會(huì)實(shí)作兩個(gè)具體的allocator(均屬原創(chuàng))。相信它們會(huì)讓你耳目一新,讓你不禁想到:哦,原來(lái)在C++中,我還可以這樣進(jìn)行內(nèi)存管理。
當(dāng)然,我的希望就是,這兩個(gè)allocator能夠起到拋磚引玉的作用,讓大家也清楚地意識(shí)到allocator的重要性,可以出現(xiàn)更多的具備各種能力的allocator,解脫C++程序員一直以來(lái)的苦難(可能是苦難)。
這兩個(gè)allocator均具備一定程度的垃圾回收能力。只是觀念上各有各的側(cè)重。我們接下來(lái)會(huì)分為兩個(gè)專題專門對(duì)它們進(jìn)行闡述。