本發(fā)明涉及數(shù)據(jù)存儲技術(shù),尤其涉及一種代碼生成方法及裝置。
背景技術(shù):
隨著互聯(lián)網(wǎng)的發(fā)展以及移動終端設(shè)備的普及,各個行業(yè)接入互聯(lián)網(wǎng)服務(wù)的訴求越來越高。因此,后臺服務(wù)程序的性能問題也越來越重要。在后臺服務(wù)體系中使用多級緩存來處理數(shù)據(jù)操作,對于不同操作頻率的數(shù)據(jù)可以從相應(yīng)級別的緩存中直接調(diào)用,避免了從磁盤等非易失性存儲介質(zhì)中讀取數(shù)據(jù)的延遲,極大提升后臺服務(wù)的響應(yīng)速度,同時也保證了后臺服務(wù)的可靠性和容災(zāi)能力。
目前,多機緩存一般在共享內(nèi)存創(chuàng)建多個級別的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn),另外,增進進程間(Boost Inter-Process)庫提供共享內(nèi)存中創(chuàng)建存儲容器的方式實現(xiàn)多級緩存。
目前,共享內(nèi)存中普遍將數(shù)據(jù)以二進制數(shù)據(jù)流的方式存儲,這樣在共享內(nèi)存中存儲數(shù)據(jù)時就對應(yīng)要進行編碼和解碼,這個過程有較高的處理器的計算資源的消耗,進而很有可能影響后臺的服務(wù)質(zhì)量。甚至導(dǎo)致在實際使用過程中還需要再加一層進程緩存,增加了數(shù)據(jù)維護和更新的成本。
針對上述問題,相關(guān)技術(shù)提供使用Boost Inter-Process)庫在共享內(nèi)存中創(chuàng)建存儲容器的方案,更加方便程序在共享內(nèi)容中存取數(shù)據(jù),降低了共享內(nèi)存的編解碼消耗,但是使用Boost Inter-Process)庫需要開發(fā)人員付出額外的學(xué)習(xí)成本,開發(fā)以及維護的成本高,難以普及使用。
綜上所述,對于使用一種簡單高效的方式在共享內(nèi)存中創(chuàng)建用于數(shù)據(jù)結(jié)構(gòu)用于存取數(shù)據(jù),減少避免編碼、解碼數(shù)據(jù)帶來的處理器的計算資源的消耗,相關(guān)技術(shù)尚無有效解決方案。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供一種代碼生成方法及裝置,能夠簡單高效的方式在共享內(nèi)存中創(chuàng)建用于數(shù)據(jù)結(jié)構(gòu)用于存取數(shù)據(jù)。
本發(fā)明實施例的技術(shù)方案是這樣實現(xiàn)的:
第一方面,本發(fā)明實施例提供一種代碼生成方法,包括:
分析源文件中的代碼,得到所述源文件中定義的用于在共享內(nèi)存中實現(xiàn)的原始數(shù)據(jù)結(jié)構(gòu);
確定各所述原始數(shù)據(jù)結(jié)構(gòu)包括的基本數(shù)據(jù)類型,聲明增進進程間通信庫中對應(yīng)各所述基本數(shù)據(jù)類型的分配器,并生成相應(yīng)分配器別名;
基于所述分配器別名,生成與相應(yīng)原始數(shù)據(jù)結(jié)構(gòu)對應(yīng)的目標(biāo)數(shù)據(jù)結(jié)構(gòu);
確定各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器定義有相應(yīng)的分配器別名;
將各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器別名、以及對應(yīng)的增進進程間通信庫數(shù)據(jù)結(jié)構(gòu)輸出為目標(biāo)文件中的代碼。
第二方面,本發(fā)明實施例提供一種代碼生成裝置,包括:
分析單元,用于分析源文件中的代碼,得到所述源文件中定義的用于在共享內(nèi)存中實現(xiàn)的原始數(shù)據(jù)結(jié)構(gòu);
別名單元,用于確定各所述原始數(shù)據(jù)結(jié)構(gòu)包括的基本數(shù)據(jù)類型,聲明增進進程間通信庫中對應(yīng)各所述基本數(shù)據(jù)類型的分配器,并生成相應(yīng)分配器別名;
生成單元,基于所述分配器別名,生成與相應(yīng)原始數(shù)據(jù)結(jié)構(gòu)對應(yīng)的目標(biāo)數(shù)據(jù)結(jié)構(gòu);
確定單元,確定各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器定義有相應(yīng)的分配器別名;
輸出單元,用于將各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器別名、以及對應(yīng)的增進進程間通信庫數(shù)據(jù)結(jié)構(gòu)輸出為目標(biāo)文件中的代碼。
第三方面,本發(fā)明實施例提供一種代碼生成裝置,包括存儲器和處理器;存儲器中存儲有可執(zhí)行指令,用于引起處理器執(zhí)行包括以下的操作:
分析源文件中的代碼,得到所述源文件中定義的用于在共享內(nèi)存中實現(xiàn)的原始數(shù)據(jù)結(jié)構(gòu);
確定各所述原始數(shù)據(jù)結(jié)構(gòu)包括的基本數(shù)據(jù)類型,聲明增進進程間通信庫中對應(yīng)各所述基本數(shù)據(jù)類型的分配器,并生成相應(yīng)分配器別名;
基于所述分配器別名,生成與相應(yīng)原始數(shù)據(jù)結(jié)構(gòu)對應(yīng)的目標(biāo)數(shù)據(jù)結(jié)構(gòu);
確定各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器定義有相應(yīng)的分配器別名;
將各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器別名、以及對應(yīng)的增進進程間通信庫數(shù)據(jù)結(jié)構(gòu)輸出為目標(biāo)文件中的代碼。
第四方面,本發(fā)明實施例提供一種存儲介質(zhì),存儲有可執(zhí)行指令,用于執(zhí)行本發(fā)明實施例提供的代碼生成方法。
本發(fā)明實施例具有以下有益效果:
對用戶定義的特定格式的數(shù)據(jù)結(jié)構(gòu)進行分析,生成程序中可用的、Boost Inter-Process庫可識別的、可放入共享內(nèi)存的數(shù)據(jù)結(jié)構(gòu),以目標(biāo)文件中的代碼描述,可以更高效合理的使用機器緩存,解決進程緩存和共享內(nèi)存的短板,并降低開發(fā)人員接入的成本。
附圖說明
圖1是本發(fā)明實施例提供的通過在共享內(nèi)存中實現(xiàn)多級緩存的服務(wù)后臺的一個典型的應(yīng)用示意圖;
圖2是本發(fā)明實施例提供的服務(wù)后臺的一個可選的軟硬件結(jié)構(gòu)示意圖;
圖3是本發(fā)明實施例提供的共享內(nèi)存中實現(xiàn)多級緩存的一個可選的架構(gòu)示意圖;
圖4是本發(fā)明實施例提供的代碼生成方法的一個可選的流程示意圖;
圖5是本發(fā)明實施例提供的代碼生成裝置的一個可選的硬件結(jié)構(gòu)示意圖;
圖6是本發(fā)明實施例提供的代碼生成裝置的一個可選的功能結(jié)構(gòu)示意圖;
圖7是本發(fā)明實施例提供的代碼生成方法的一個可選的流程示意圖。
具體實施方式
以下結(jié)合附圖及實施例,對本發(fā)明進行進一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所提供的實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。另外,以下所提供的實施例是用于實施本發(fā)明的部分實施例,而非提供實施本發(fā)明的全部實施例,在本領(lǐng)域技術(shù)人員不付出創(chuàng)造性勞動的前提下,對以下實施例的技術(shù)方案進行重組所得的實施例、以及基于對發(fā)明所實施的其他實施例均屬于本發(fā)明的保護范圍。
需要說明的是,在本發(fā)明實施例中,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的方法或者裝置不僅包括所明確記載的要素,而且還包括沒有明確列出的其他要素,或者是還包括為實施方法或者裝置所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括該要素的方法或者裝置中還存在另外的相關(guān)要素(例如方法中的步驟或者裝置中的單元)。
例如,本發(fā)明實施例提供的代碼生成方法包含了一系列的步驟,但是本發(fā)明實施例提供的代碼生成方法不限于所記載的步驟,同樣地,本發(fā)明實施例提供的代碼生成裝置包括了一系列單元,但是本發(fā)明實施例提供的代碼生成裝置不限于包括所明確記載的單元,還可以包括為獲取相關(guān)信息、或基于信息進行處理時所需要設(shè)置的單元。
對本發(fā)明進行進一步詳細(xì)說明之前,對本發(fā)明實施例中涉及的名詞和術(shù)語進行說明,本發(fā)明實施例中涉及的名詞和術(shù)語適用于如下的解釋。
1)共享內(nèi)存(Shared Memory),在多處理器的服務(wù)后臺中,可以被不同進程訪問的內(nèi)存。共享內(nèi)存是多進程之間的通信方法,通常用于一個程序的多進程間通信,當(dāng)然實際上多個程序間也可以通過共享內(nèi)存來傳遞信息。
多個進程把共享內(nèi)存映射到相應(yīng)進程的地址空間中去,由于共享內(nèi)存對于各自附著的進程是共享的,一次進程可以很方便的通過共享內(nèi)存上的共有數(shù)據(jù)進行通信。當(dāng)一個進程附著到共享內(nèi)存上后,得到一個指向這塊共享內(nèi)存的指針;進程可以像使用其他內(nèi)存一樣使用共享內(nèi)存。
2)多級緩存,根據(jù)服務(wù)后臺的系統(tǒng)架構(gòu)的不同層級,在服務(wù)后臺的共享內(nèi)存中進行數(shù)據(jù)緩存,以提升對不同層級的數(shù)據(jù)的存取效率。
3)容器,以共享方式使用主機上的內(nèi)存、處理器和存儲空間中實現(xiàn)的通用的數(shù)據(jù)結(jié)構(gòu)。
4)增進進程間(BIP,Boost Inter-Process)庫,由C++標(biāo)準(zhǔn)委員會庫公司組發(fā)起的,為共享內(nèi)存的使用提供了新的方式,通過內(nèi)存分配器來支持在共享內(nèi)存中設(shè)置容器,例如設(shè)置圖(map)、向量(vector)和列表(list)等類型的容器。
5)數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的不同數(shù)據(jù)類型的數(shù)據(jù)元素的集合。通常情況下,選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運行或者存儲效率。
6)數(shù)據(jù)類型,數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)元素的類型,包括整型(int)、長整型(long)、字符型(char)、字符串(string)和雙精度浮點型(double)等,上述數(shù)據(jù)類型也稱為基本數(shù)據(jù)類型。
如圖1所示本發(fā)明實施例提供的通過在共享內(nèi)存中實現(xiàn)多級緩存的服務(wù)后臺的一個典型的應(yīng)用示意圖,應(yīng)用于服務(wù)器/客戶端的架構(gòu)中。
在圖1中,代碼生成裝置實施為網(wǎng)絡(luò)應(yīng)用的服務(wù)后臺10,示例性地,網(wǎng)絡(luò)應(yīng)用為社交軟件、在線游戲、在線視頻(如動漫)和在線電子書(例如,如漫畫)等。
服務(wù)后臺10在本地緩存與業(yè)務(wù)相關(guān)的部分或者全部數(shù)據(jù),用于在需要時直接通過互聯(lián)網(wǎng)20、接入點40向用戶終端30運行的應(yīng)用客戶端返回,節(jié)省了從硬盤等非易失性存儲介質(zhì)查找數(shù)據(jù)帶來的延遲,提高了數(shù)據(jù)存取的效率。
例如,對于手機游戲應(yīng)用而言,服務(wù)后臺10本地可以存儲手機游戲的相關(guān)介紹信息,包括游戲的版本,游戲劇情、游戲角色和任務(wù)介紹等信息,當(dāng)用戶需要了解游戲的相關(guān)信息時可以及時向多個用戶終端30的客戶端返回數(shù)據(jù)。
再例如,對于動漫播放應(yīng)用而言,代碼生成裝置本地可以存儲動漫的劇情、片長和人物介紹等信息,當(dāng)用戶需要了解動漫的相關(guān)信息時可以及時向多個用戶終端30的客戶端返回數(shù)據(jù)。
如圖2所示的代碼生成裝置20的一個可選的軟硬件結(jié)構(gòu)示意圖,由于服務(wù)后臺緩存的數(shù)據(jù)是需要供多個進程(如圖1中的多個用戶終端30運行的客戶端程序)進行存取,服務(wù)后臺在本地的共享內(nèi)存中存儲數(shù)據(jù)以實現(xiàn)數(shù)據(jù)的緩存,在服務(wù)后臺的物理內(nèi)存中劃分出部分內(nèi)存空間作為共享內(nèi)存27,在共享內(nèi)存27中緩存數(shù)據(jù)供多個用戶終端30的客戶端在共享內(nèi)存中存儲數(shù)據(jù)。
這里再結(jié)合圖2對代碼生成裝置的軟硬件結(jié)構(gòu)進行說明,
如上所述,以代碼生成裝置基于用戶側(cè)終端的硬件資源實現(xiàn)時,參見圖2示出的代碼生成裝置的一個可選的軟硬件結(jié)構(gòu)示意圖,代碼生成裝置包括硬件層、中間層、操作系統(tǒng)層和軟件層。然而,本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,圖2示出的代碼生成裝置的結(jié)構(gòu)僅為示例,并不構(gòu)成對代碼生成裝置結(jié)構(gòu)的限定。例如,代碼生成裝置可以根據(jù)實施需要設(shè)置較圖2更多的組件,或者根據(jù)實施需要省略設(shè)置部分組件。
代碼生成裝置20的硬件層包括處理器21、輸入/輸出接口23,存儲介質(zhì)24以及網(wǎng)絡(luò)接口22,組件可以經(jīng)系統(tǒng)總線連接通信。
處理器21可以采用中央處理器(CPU)、微處理器(MCU,Microcontroller Unit)、專用集成電路(ASIC,Application Specific Integrated Circuit)或邏輯可編程門陣列(FPGA,F(xiàn)ield-Programmable Gate Array)實現(xiàn)。
輸入/輸出接口23可以采用如顯示屏、觸摸屏、揚聲器等輸入/輸出器件實現(xiàn)。
存儲介質(zhì)24可以采用閃存、硬盤、光盤等非易失性存儲介質(zhì)實現(xiàn),也可以采用雙倍率(DDR,Double Data Rate)動態(tài)緩存等易失性存儲介質(zhì)實現(xiàn),其中存儲有用以執(zhí)行上述代碼生成方法的可執(zhí)行指令。
示例性地,存儲介質(zhì)24可以與代碼生成裝置的其他組件集中設(shè)置,也可以相對于代碼生成裝置中的其他組件分布設(shè)置。網(wǎng)絡(luò)接口22向處理器21提供外部數(shù)據(jù)如異地設(shè)置的存儲介質(zhì)24的訪問能力,示例性地,網(wǎng)絡(luò)接口22可以基于近場通信(NFC,Near Field Communication)技術(shù)、藍牙(Bluetooth)技術(shù)、紫蜂(ZigBee)技術(shù)進行的近距離通信,另外,還可以實現(xiàn)如基于碼分多址(CDMA,Code Division Multiple Access)、寬帶碼分多址(WCDMA,Wideband Code Division Multiple Access)等通信制式及其演進制式的通信。
驅(qū)動層包括用于供操作系統(tǒng)26識別硬件層并與硬件層各組件通信的中間件15,例如可以為針對硬件層的各組件的驅(qū)動程序的集合。
操作系統(tǒng)26用于提供面向用戶的圖形界面,示例性地,包括插件圖標(biāo)、桌面背景和應(yīng)用圖標(biāo),操作系統(tǒng)26支持用戶經(jīng)由圖形界面對設(shè)備的控制本發(fā)明實施例對上述設(shè)備的軟件環(huán)境如操作系統(tǒng)類型、版本不做限定,例如可以是Linux操作系統(tǒng)、UNIX操作系統(tǒng)或其他操作系統(tǒng)。
如圖3所示為本發(fā)明實施例提供的共享內(nèi)存中實現(xiàn)多級緩存的一個可選的架構(gòu)示意圖。
根據(jù)不同數(shù)據(jù)的分級原則分為多個級別,相應(yīng)地,共享內(nèi)存劃分為不同的級別,每個級別的共享內(nèi)存中存儲相應(yīng)級別的數(shù)據(jù)。在圖3中,從一級緩存到三級緩存按照數(shù)據(jù)的存取頻率進行劃分,例如從一級緩存到三級緩存中的數(shù)據(jù)的存取頻率依次降低。
服務(wù)后臺10在接收到來自用戶終端30數(shù)據(jù)請求時,首先從一級緩存查找要需要存取的數(shù)據(jù),如果沒有命中數(shù)據(jù)請求,則從二級緩存中查找需要存取的數(shù)據(jù),因此類推,直至在任一級緩存中命中數(shù)據(jù)請求,對數(shù)據(jù)進行存儲請返回存取結(jié)果。
可以理解地,如果多級緩存中數(shù)據(jù)沒有命中數(shù)據(jù)請求,則服務(wù)后臺10在本地或遠端的非易失性存儲介質(zhì)承載的數(shù)據(jù)庫中查找數(shù)據(jù)并進行響應(yīng)。由于存儲頻率的數(shù)據(jù)能夠在多級緩存中命中,顯著降低了數(shù)據(jù)存取的延遲,提升了數(shù)據(jù)響應(yīng)性能。
通過開發(fā)的代碼生成裝置對用戶自定義的數(shù)據(jù)結(jié)構(gòu),(例如,前述的代碼1描述的數(shù)據(jù)結(jié)構(gòu))進行處理,形成Boost Inter-Process庫支持的、支持存放于共享內(nèi)存中的目標(biāo)數(shù)據(jù)結(jié)構(gòu)(如前述的代碼2描述的數(shù)據(jù)結(jié)構(gòu))。
由于目標(biāo)數(shù)據(jù)結(jié)構(gòu)可供Boost Inter-Process庫直接使用,因此可以通過Boost Inter-Process庫在共享內(nèi)存中存儲目標(biāo)數(shù)據(jù)結(jié)構(gòu)的存儲數(shù)據(jù),避免將數(shù)據(jù)以二進制數(shù)據(jù)流的方式存儲時,由于共享內(nèi)存中存儲數(shù)據(jù)時就對應(yīng)要進行編碼和解碼而導(dǎo)致的較高的處理器的計算資源的消耗,已經(jīng)影響服務(wù)后臺的服務(wù)質(zhì)量的問題;
同時,由于可供Boost Inter-Process庫直接使用的目標(biāo)數(shù)據(jù)結(jié)構(gòu)是根據(jù)代碼生成裝置基于用戶定義的原始數(shù)據(jù)結(jié)構(gòu)自動生成的,可以節(jié)約開發(fā)者使用Boost Inter-Process庫的語法定義目標(biāo)數(shù)據(jù)結(jié)構(gòu)的過程,從而解除Boost Inter-Process庫使用時帶來的開發(fā)、維護成本高的技術(shù)壁壘。
在共享內(nèi)存中實現(xiàn)多級緩存時,不可避免地需要到如何在共享內(nèi)存存儲數(shù)據(jù)的問題,如果在共享內(nèi)存中普遍將數(shù)據(jù)以二進制數(shù)據(jù)流的方式存儲,這樣在共享內(nèi)存中存儲數(shù)據(jù)時就對應(yīng)要進行編碼和解碼,這個過程有較高的處理器的計算資源的消耗,進而很有可能影響后臺的服務(wù)質(zhì)量。甚至導(dǎo)致在實際使用過程中還需要再加一層進程緩存,增加了數(shù)據(jù)維護和更新的成本。
為了避免上述的二進制數(shù)據(jù)流的方式存儲的數(shù)據(jù)的編碼和解碼問題,Boost Inter-Process庫提供在共享內(nèi)存中創(chuàng)建存儲容器,基于容器存儲數(shù)據(jù)的方案,更加方便程序在共享內(nèi)容中存取數(shù)據(jù),降低了共享內(nèi)存的編解碼消耗,但是使用BIP庫需要開發(fā)人員付出額外的學(xué)習(xí)成本,開發(fā)以及維護的成本高,難以普及使用。
下面結(jié)合具體示例進行說明,Boost庫是由C++標(biāo)準(zhǔn)委員會庫公司組發(fā)起的,是C++標(biāo)準(zhǔn)庫的后備。Boost Inter-Process庫為共享內(nèi)存的使用提供了新的方式,通過Boost Inter-Process庫提供的內(nèi)存分配器在內(nèi)存中設(shè)置容器,如前述的map、vector和list)等類型的容器,使用容器來支持?jǐn)?shù)據(jù)的存取,更加方便了程序的使用,降低了共享內(nèi)存的編解碼消耗。
然而,使用Boost Inter-Process庫在共享內(nèi)存中存儲容器需要較高的開發(fā)維護成本,需要對在多級緩存中實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)進行復(fù)雜的定義,下面進行說明。
以在共享內(nèi)存中存儲C++std系列容器為例,如果需要定義一個基本數(shù)據(jù)類型為字符(string)的vector,使用如下的代碼1描述:
代碼1
std::vector<std::string>myShmVector
以在共享內(nèi)存中定義Boost Inter-Process庫的容器為例,如果同樣需要定義一個基本數(shù)據(jù)類型為string的vector,則需要使用如下方式進行同樣的定義:
Boost Inter-Process庫允許在共享內(nèi)存和內(nèi)存映射文件上創(chuàng)建復(fù)雜對象。例如,可以在共享內(nèi)存上構(gòu)造容器。只需創(chuàng)建一個共享內(nèi)存,然后聲明一個Boost Inter-Process庫分配器(后續(xù)也簡稱為分配器),然后就可在共享內(nèi)存上采用與創(chuàng)建普通對象一樣的方式構(gòu)建vector,從而可供不同的程序訪問。
例如,如果需要在共享內(nèi)存構(gòu)建基本數(shù)據(jù)類型為string的vector,使用如下的代碼2:
using namespace boost::Inter-Process;
//定義基本數(shù)據(jù)類型為char的分配器的別名
typedef allocator<char,managed_shared_memory::segment_manager>CharAllocator;
//使用char類型的分配器定義基本類型為string的vector
typedef basic_string<char,std::char_traits<char>,CharAllocator>MyShmString;
//定義基本數(shù)據(jù)類型為string類型分配器的別名
typedef
allocator<MyShmString,managed_shared_memory::segment_manager>StringShmAllocator;
//使用string類型的分配器定義基本類型為string的vector
typedef vector<MyShmString,StringShmAllocator>myShmVector;
由此可見,實現(xiàn)Boost Inter-Process庫的容器與C++std容器的主要區(qū)別在于,實現(xiàn)Boost Inter-Process庫時,需要進行不同數(shù)據(jù)類型的分配器的別名的定義,如前述的字符(char)類型的分配器、string類型分配器的別名的定義,已經(jīng)使用相應(yīng)類型的分配器定義相應(yīng)數(shù)據(jù)類型的向量,導(dǎo)致使用Boost Inter-Process庫在共享內(nèi)存中存儲容器時,需要額外付出的開發(fā)成本,這影響了在共享內(nèi)存中實現(xiàn)多級緩存的效率。
針對上述問題,本發(fā)明實施例提供代碼生成方法。參見圖4示出的本發(fā)明實施例提供的代碼生成方法的一個可選的流程示意圖,包括以下步驟:
步驟101,分析源文件中的代碼,得到所述源文件中定義的用于在共享內(nèi)存中實現(xiàn)的原始數(shù)據(jù)結(jié)構(gòu)。
在一個實施例中,源文件是以C++std標(biāo)準(zhǔn)描述的需要在共享內(nèi)存中實現(xiàn)的數(shù)據(jù)結(jié)構(gòu),源文件中支持定義多個不同類型的數(shù)據(jù)結(jié)構(gòu);源文件中對于原始的數(shù)據(jù)結(jié)構(gòu)的定義需要遵從C++std標(biāo)準(zhǔn)描述規(guī)范,例如在源文件中結(jié)構(gòu)體、容器定義需要閉合,另外,需要在共享內(nèi)存中實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)在源文件的起始位置定義。
在一個實施例中,分析所述源文件之前,對所述源文件進行語法檢測,例如括號未閉合;語法錯誤;未知的數(shù)據(jù)類型等,并在檢測語法錯誤時輸出錯誤提示,實現(xiàn)確保源文件的語法正確性的效果。
步驟102,確定各所述原始數(shù)據(jù)結(jié)構(gòu)包括的基本數(shù)據(jù)類型,聲明增進進程間通信庫中對應(yīng)各所述基本數(shù)據(jù)類型的分配器,并生成相應(yīng)分配器別名。
可以理解地,原始數(shù)據(jù)結(jié)構(gòu)中可以包括一個或多個基本數(shù)據(jù)類型,例如,可以通過包括string、int和double等基本數(shù)據(jù)類型。
以定義基本數(shù)據(jù)類型為char的分配器的別名為例,可以通過如下的代碼實現(xiàn):
typedef allocator<char,managed_shared_memory::segment_manager>CharAllocator;
步驟103,基于所述分配器別名,生成與相應(yīng)原始數(shù)據(jù)結(jié)構(gòu)對應(yīng)的目標(biāo)數(shù)據(jù)結(jié)構(gòu)。
在一個實施例中,對于源文件中包括的各個數(shù)據(jù)結(jié)構(gòu),通過逐行分析源文件,對于源文件中包括的各個數(shù)據(jù)結(jié)構(gòu),對應(yīng)生成新的數(shù)據(jù)結(jié)構(gòu)也即目標(biāo)數(shù)據(jù)結(jié)構(gòu)中所包括的數(shù)據(jù)類型對應(yīng)的分配器的別名,生成新的數(shù)據(jù)結(jié)構(gòu)也即目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼描述。如前述的代碼1和代碼2,目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼描述存在于同名的以.h結(jié)尾的頭文件中,從而可以被用戶程序直接使用。
步驟104,確定各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器定義有相應(yīng)的分配器別名。
在一個實施例中,目標(biāo)數(shù)據(jù)結(jié)構(gòu)是否定義有分配器別名,是指目標(biāo)數(shù)據(jù)結(jié)構(gòu)表中包括的數(shù)據(jù)類型的分配器是否已經(jīng)定義有相應(yīng)的分配器別名。通過分析出各目標(biāo)數(shù)據(jù)結(jié)構(gòu)所包括的數(shù)據(jù)類型,判斷出當(dāng)前數(shù)據(jù)類型對應(yīng)的分配器是否已經(jīng)定義有別名:
1)如果判斷出當(dāng)前目標(biāo)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)類型均已經(jīng)定義有別名,則繼續(xù)分析下一個目標(biāo)數(shù)據(jù)結(jié)構(gòu),直至分析完畢所有目標(biāo)數(shù)據(jù)結(jié)構(gòu)。
2)如果判斷出當(dāng)前目標(biāo)數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)類型未定義有分配器別名,則根據(jù)當(dāng)前目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的原始數(shù)據(jù)結(jié)構(gòu),分析原始數(shù)據(jù)結(jié)構(gòu)包括的數(shù)據(jù)類型:
2.1)_如果沒有分析出,說明原始數(shù)據(jù)結(jié)構(gòu)的語法定義有問題,異常退出并提示用戶原始數(shù)據(jù)結(jié)構(gòu)中出問題的行號;
2.2)如果分析出,則判斷相應(yīng)數(shù)據(jù)類型是否已被聲明相應(yīng)的分配器:
2.2.1)如果未聲明,將相應(yīng)的數(shù)據(jù)類型添加為新基本數(shù)據(jù)類型,生成對應(yīng)所述新基本數(shù)據(jù)類型的分配器別名。另外,將該新數(shù)據(jù)類型作為再次判斷目標(biāo)數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)結(jié)構(gòu)是否定義有分配器別名時優(yōu)先處理的數(shù)據(jù)類型,從而,能夠盡快確認(rèn)該目標(biāo)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)類型對應(yīng)的分配器已經(jīng)定義有別名。
2.2.2)如果已經(jīng)聲明,根據(jù)判斷為未定義有相應(yīng)分配器別名的數(shù)據(jù)類型,生成相應(yīng)數(shù)據(jù)類型的分配器別名。
步驟105,將各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器別名、以及對應(yīng)的增進進程間通信庫數(shù)據(jù)結(jié)構(gòu)輸出為目標(biāo)文件中的代碼。
在一個實施例中,目標(biāo)文件中的代碼是針對目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼化描述,符合Boost Inter-Process庫在共享內(nèi)存中存儲容器的語法描述,因此可以被Boost Inter-Process庫直接讀取識別。相應(yīng)地,調(diào)用增進進程間通信庫應(yīng)用程序接口,將所述目標(biāo)文件添加到共享內(nèi)存中,基于所述目標(biāo)文件中的目標(biāo)數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù),同時由于是在共享內(nèi)存中基于目標(biāo)數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù),可以支持不同進程存取數(shù)據(jù)。
本發(fā)明實施例還提供用于執(zhí)行前述代碼執(zhí)行方法的代碼生成裝置,本發(fā)明實施例提供的本代碼生成裝置可以采用各種方式實施,例如,可以實施為前述的服務(wù)平臺中的代碼生成功能模塊,使用服務(wù)后臺中的硬件資源(如處理器等計算資源)運行響應(yīng)的可執(zhí)行指令實施代碼生成方法。
當(dāng)然,代碼生成裝置也可以實施為獨立于服務(wù)后臺的代碼生成設(shè)備,如圖5示出的代碼生成裝置50的一個可選的硬件結(jié)構(gòu)示意圖,包括:處理器54、輸入/輸出接口56(例如顯示器、鍵盤、觸摸屏、揚聲器麥克風(fēng)中的一個或多個),存儲介質(zhì)57以及網(wǎng)絡(luò)接口55,組件可以經(jīng)系統(tǒng)總線58連接通信。
存儲介質(zhì)可以為ROM(例如,只讀存儲器、FLASH存儲器、轉(zhuǎn)移裝置等)、磁存儲介質(zhì)(例如,磁帶、磁盤驅(qū)動器等)、光學(xué)存儲介質(zhì)(例如,CD-ROM、DVD-ROM、紙卡、紙帶等)以及其他熟知類型的程序存儲器,其中存儲有用于執(zhí)行代碼生成方法的可執(zhí)行指令。
需要說明的是,代碼生成裝置中的各模塊也可以部署在同一實體設(shè)備中,當(dāng)然代碼生成裝置中的硬件功能模塊可以分布式實施的,例如其中的部分模塊分布實施在不同的區(qū)域并設(shè)置相應(yīng)的通信接口,通過任何可用的通信方式如蜂窩、專用電纜、互聯(lián)網(wǎng)或局域網(wǎng)等方式通信。例如,代碼生成設(shè)備中的存儲介質(zhì)分布在不同的區(qū)域,并通過部署為分布式數(shù)據(jù)庫的方式向處理器提供訪問。
對前述代碼生成裝置的功能結(jié)構(gòu)進行說明,參見圖6示出的本發(fā)明實施例提供的代碼生成裝置60的一個可選的功能結(jié)構(gòu)示意圖,包括:分析單元61、別名單元62、生成單元63、確定單元64、輸出單元65和調(diào)用單元66,下面分別進行說明。
分析單元61,用于分析源文件中的代碼,得到所述源文件中定義的用于在共享內(nèi)存中實現(xiàn)的原始數(shù)據(jù)結(jié)構(gòu)。
在一個實施例中,所述分析單元61,還用于分析所述源文件之前,對所述源文件進行語法檢測,并在檢測語法錯誤時輸出錯誤提示。
源文件是以C++std標(biāo)準(zhǔn)描述的需要在共享內(nèi)存中實現(xiàn)的數(shù)據(jù)結(jié)構(gòu),源文件中支持定義多個不同類型的數(shù)據(jù)結(jié)構(gòu);源文件中對于原始的數(shù)據(jù)結(jié)構(gòu)的定義需要遵從C++std標(biāo)準(zhǔn)描述規(guī)范,例如在源文件中結(jié)構(gòu)體、容器定義需要閉合,另外,需要在共享內(nèi)存中實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)在源文件的起始位置定義。
別名單元62,用于確定各所述原始數(shù)據(jù)結(jié)構(gòu)包括的基本數(shù)據(jù)類型,可以理解地,原始數(shù)據(jù)結(jié)構(gòu)中可以包括一個或多個基本數(shù)據(jù)類型,例如,可以通過包括string、int和double等基本數(shù)據(jù)類型,別名單元62聲明增進進程間通信庫中對應(yīng)各所述基本數(shù)據(jù)類型的分配器,并生成相應(yīng)分配器別名。
以定義基本數(shù)據(jù)類型為char的分配器的別名為例,可以通過如下的代碼實現(xiàn):
typedef allocator<char,managed_shared_memory::segment_manager>CharAllocator;
生成單元63,用于基于所述分配器別名,生成與相應(yīng)原始數(shù)據(jù)結(jié)構(gòu)對應(yīng)的目標(biāo)數(shù)據(jù)結(jié)構(gòu)。
在一個實施例中,生成單元63對于源文件中包括的各個數(shù)據(jù)結(jié)構(gòu),通過逐行分析源文件,對于源文件中包括的各個數(shù)據(jù)結(jié)構(gòu),對應(yīng)生成新的數(shù)據(jù)結(jié)構(gòu)也即目標(biāo)數(shù)據(jù)結(jié)構(gòu)中所包括的數(shù)據(jù)類型對應(yīng)的分配器的別名,生成新的數(shù)據(jù)結(jié)構(gòu)也即目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼描述。如前述的代碼1和代碼2,目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼描述存在于同名的以.h結(jié)尾的頭文件中,從而可以被用戶程序直接使用。
確定單元64,確定各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器定義有相應(yīng)的分配器別名。
在一個實施例中,目標(biāo)數(shù)據(jù)結(jié)構(gòu)是否定義有分配器別名,是指目標(biāo)數(shù)據(jù)結(jié)構(gòu)表中包括的數(shù)據(jù)類型的分配器是否已經(jīng)定義有相應(yīng)的分配器別名。通過分析出各目標(biāo)數(shù)據(jù)結(jié)構(gòu)所包括的數(shù)據(jù)類型,判斷出當(dāng)前數(shù)據(jù)類型對應(yīng)的分配器是否已經(jīng)定義有別名:
1)如果判斷出當(dāng)前目標(biāo)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)類型均已經(jīng)定義有別名,則繼續(xù)分析下一個目標(biāo)數(shù)據(jù)結(jié)構(gòu),直至分析完畢所有目標(biāo)數(shù)據(jù)結(jié)構(gòu)。
2)如果判斷出當(dāng)前目標(biāo)數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)類型未定義有分配器別名,則根據(jù)當(dāng)前目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的原始數(shù)據(jù)結(jié)構(gòu),分析原始數(shù)據(jù)結(jié)構(gòu)包括的數(shù)據(jù)類型:
2.1)_如果沒有分析出,說明原始數(shù)據(jù)結(jié)構(gòu)的語法定義有問題,異常退出并提示用戶原始數(shù)據(jù)結(jié)構(gòu)中出問題的行號;
2.2)如果分析出,則判斷相應(yīng)數(shù)據(jù)類型是否已被聲明相應(yīng)的分配器:
2.2.1)如果未聲明,將相應(yīng)的數(shù)據(jù)類型添加為新基本數(shù)據(jù)類型,生成對應(yīng)所述新基本數(shù)據(jù)類型的分配器別名。另外,將該新數(shù)據(jù)類型作為再次判斷目標(biāo)數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)結(jié)構(gòu)是否定義有分配器別名時優(yōu)先處理的數(shù)據(jù)類型,從而,能夠盡快確認(rèn)該目標(biāo)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)類型對應(yīng)的分配器已經(jīng)定義有別名。
2.2.2)如果已經(jīng)聲明,根據(jù)判斷為未定義有相應(yīng)分配器別名的數(shù)據(jù)類型,生成相應(yīng)數(shù)據(jù)類型的分配器別名。
輸出單元65,用于將各所述目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器別名、以及對應(yīng)的增進進程間通信庫數(shù)據(jù)結(jié)構(gòu)輸出到目標(biāo)文件中的代碼。
在一個實施例中,目標(biāo)文件中的代碼是針對目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼化描述,符合Boost Inter-Process庫在共享內(nèi)存中存儲容器的語法描述,因此可以被Boost Inter-Process庫直接讀取識別。
在一個實施例中,還包括:調(diào)用單元66,用于調(diào)用增進進程間通信庫應(yīng)用程序接口,將所述目標(biāo)文件添加到共享內(nèi)存中,基于所述目標(biāo)文件中的目標(biāo)數(shù)據(jù)結(jié)構(gòu)支持不同進程存取數(shù)據(jù)。
對于在服務(wù)器后臺的共享內(nèi)存中設(shè)置目標(biāo)數(shù)據(jù)結(jié)構(gòu)來說,通過調(diào)用增進進程間通信庫應(yīng)用程序接口,將所述目標(biāo)文件添加到共享內(nèi)存中,基于所述目標(biāo)文件中的目標(biāo)數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù),同時由于是在共享內(nèi)存中基于目標(biāo)數(shù)據(jù)結(jié)構(gòu)存儲數(shù)據(jù),可以支持不同進程存取數(shù)據(jù)。
以下結(jié)合圖7對代碼生成裝置根據(jù)用戶定義的原始數(shù)據(jù)結(jié)構(gòu)生成目標(biāo)數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)過程進行說明,包括如下幾個階段。
階段一、代碼生成裝置接收用戶提交的源文件。
這里,源文件是用戶在以“.bip”結(jié)尾的文件,其中用戶自定義需要在共享內(nèi)存中使用的原始的數(shù)據(jù)結(jié)構(gòu),此數(shù)據(jù)結(jié)構(gòu)需要在共享內(nèi)存中實現(xiàn)。
對數(shù)據(jù)結(jié)構(gòu)的定義存儲于以.bip結(jié)尾的文件(后續(xù)也稱為bip文件),bip文件中支持定義多個不同類型的數(shù)據(jù)結(jié)構(gòu);在bip文件中對于原始的數(shù)據(jù)結(jié)構(gòu)的定義需要遵從特定規(guī)范,bip文件關(guān)于數(shù)據(jù)結(jié)構(gòu)的定義的一個代碼描述如下:
代碼3
在上述代碼3中,命名空間(namespace)后的值“nsp”指的是數(shù)據(jù)結(jié)構(gòu)所在的命名空間,滿足如下的特定規(guī)范:
1)結(jié)構(gòu)體(struct)內(nèi)部定義方式和C++std容器用法相同;
2)定義容器時“<>“必須要閉合;
3)struct需要閉合;
4)用戶需要使用到的數(shù)據(jù)結(jié)構(gòu)需要定義在bip文件中的開始位置,比如在代碼3中的結(jié)構(gòu)體data_in_shm中使用數(shù)據(jù)結(jié)構(gòu)complex_data,所以數(shù)據(jù)結(jié)構(gòu)complex_data需要在代碼3的開始位置定義。
階段二、代碼自動生成裝置析用戶生成的bip文件,進行語法檢測,如果檢測到語法錯誤則停止執(zhí)行并報錯,提示用戶bip文件中存在語法錯誤。
對bip文件進行語法錯誤檢測,包括:括號未閉合;語法錯誤;未知的數(shù)據(jù)類型等。
階段三、語法檢測通過后,根據(jù)用戶在bip文件(源文件)中定義的數(shù)據(jù)結(jié)構(gòu)(也稱為原始數(shù)據(jù)結(jié)構(gòu)或基本數(shù)據(jù)結(jié)構(gòu)),生成與數(shù)據(jù)結(jié)構(gòu)對應(yīng)的分配器的別名,利用生成的分配器的別名生成新的數(shù)據(jù)結(jié)構(gòu)(也稱為目標(biāo)數(shù)據(jù)結(jié)構(gòu)),目標(biāo)數(shù)據(jù)結(jié)構(gòu)實質(zhì)上也就是目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼描述,如代碼1和代碼2,目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼描述存在于同名的以.h結(jié)尾的頭文件中,可以被用戶程序直接使用。
下面再對階段三的實現(xiàn)過程進行說明。
步驟1、首先,分析bip文件得到bip文件中所涉及的基本的數(shù)據(jù)類型,對于bip文件中涉及的基本數(shù)據(jù)類型,生成相應(yīng)基本數(shù)據(jù)類型的分配器的別名。
例如,這里所涉及的基本數(shù)據(jù)類型主要包括int、char和double等數(shù)據(jù)類型。
步驟2、其次,逐行分析bip文件,對于bip文件中包括的各個數(shù)據(jù)結(jié)構(gòu),對應(yīng)生成新的數(shù)據(jù)結(jié)構(gòu)也即目標(biāo)數(shù)據(jù)結(jié)構(gòu)。
對于bip文件中包括的各個數(shù)據(jù)結(jié)構(gòu),通過數(shù)據(jù)結(jié)構(gòu)中所包括的數(shù)據(jù)類型對應(yīng)的分配器的別名,生成新的數(shù)據(jù)結(jié)構(gòu)也即目標(biāo)數(shù)據(jù)結(jié)構(gòu)的代碼描述,如代碼1和代碼2。
以“;”隔離的所有目標(biāo)數(shù)據(jù)結(jié)構(gòu);把目標(biāo)數(shù)據(jù)結(jié)構(gòu)是否定義有分配器別名的信息寫入目標(biāo)數(shù)據(jù)結(jié)構(gòu)表中。
目標(biāo)數(shù)據(jù)結(jié)構(gòu)是否定義有分配器別名,是指目標(biāo)數(shù)據(jù)結(jié)構(gòu)表中包括的數(shù)據(jù)類型的分配器是否已經(jīng)定義有相應(yīng)的分配器別名。
例如,在圖7中,對于基本數(shù)據(jù)類型為字符(string)的vector,以二進制1表示數(shù)據(jù)類型string的對應(yīng)的分配器已經(jīng)定義有別名;對于map<string,vector<int>>,以二進制1表示該數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)類型string、int對應(yīng)的分配器已經(jīng)定義有別名;對于struct complex_data,以二進制0表示該數(shù)據(jù)結(jié)構(gòu)包括的數(shù)據(jù)類型的分配器未定義有別名。
步驟3、篩選每個目標(biāo)數(shù)據(jù)結(jié)構(gòu),分析出每個目標(biāo)數(shù)據(jù)結(jié)構(gòu)所包括的數(shù)據(jù)類型,遍歷每個目標(biāo)數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)類型,判斷各數(shù)據(jù)類型對應(yīng)的分配器是否已經(jīng)定義有別名,如果是,則繼續(xù)分析下一個目標(biāo)數(shù)據(jù)結(jié)構(gòu),直至分析完畢所有目標(biāo)數(shù)據(jù)結(jié)構(gòu),進入步驟6;如果否,則進入步驟4。
步驟4,遞歸加循環(huán)分析此目標(biāo)數(shù)據(jù)結(jié)構(gòu)的原始數(shù)據(jù)結(jié)構(gòu)包括的數(shù)據(jù)類型,并進行分析處理,判斷是否分析出原始數(shù)據(jù)結(jié)構(gòu)包括的數(shù)據(jù)類型:
如果沒有分析出,說明原始數(shù)據(jù)結(jié)構(gòu)的語法定義有問題,異常退出并提示用戶原始數(shù)據(jù)結(jié)構(gòu)中出問題的行號;
如果分析出原始數(shù)據(jù)結(jié)構(gòu)包括的數(shù)據(jù)類型,進入步驟5。
原始數(shù)據(jù)結(jié)構(gòu)與目標(biāo)數(shù)據(jù)結(jié)構(gòu)對應(yīng),代碼生成裝置根據(jù)用戶在bip文件中定義的原始數(shù)據(jù)結(jié)構(gòu)形成對應(yīng)的目標(biāo)數(shù)據(jù)結(jié)構(gòu)。
例如,對于代碼1描述的目標(biāo)數(shù)據(jù)結(jié)構(gòu)而言,分析對應(yīng)的原始數(shù)據(jù)結(jié)構(gòu)可以得知包括數(shù)據(jù)類型string,對于代碼3描述的目標(biāo)數(shù)據(jù)結(jié)構(gòu)而言,分析對應(yīng)的原始數(shù)據(jù)結(jié)構(gòu)可以得到包括complex_map。
步驟5,判斷原始數(shù)據(jù)結(jié)構(gòu)包括的數(shù)據(jù)類型對應(yīng)的分配器是否被聲明:
如果未聲明,則將步驟3中判斷為未定義有相應(yīng)分配器別名的數(shù)據(jù)類型添加為新的基本數(shù)據(jù)類型,以生成針對該新基本數(shù)據(jù)類型的分配器的別名,同時,將該新數(shù)據(jù)類型作為在再次執(zhí)行步驟4優(yōu)先處理的數(shù)據(jù)類型,從而,能夠盡快確認(rèn)該目標(biāo)數(shù)據(jù)結(jié)構(gòu)中各數(shù)據(jù)類型對應(yīng)的分配器已經(jīng)定義有別名;進入步驟3繼續(xù)處理下一個目標(biāo)數(shù)據(jù)結(jié)構(gòu);
如果已經(jīng)聲明,則針對步驟3中判斷為未定義有相應(yīng)分配器別名的數(shù)據(jù)類型,生成相應(yīng)數(shù)據(jù)類型的分配器的別名;進入步驟6。
步驟6,將生成的目標(biāo)數(shù)據(jù)結(jié)構(gòu)的分配器別名以及對應(yīng)的Boost Inter-Process)庫數(shù)據(jù)結(jié)構(gòu),輸出為目標(biāo)文件中的代碼描述,進入步驟3繼續(xù)分析下一個目標(biāo)數(shù)據(jù)結(jié)構(gòu)。
例如,遇到目標(biāo)數(shù)據(jù)類型vector<T>,則生成如下代碼:
typedef vector<T,TShmAllocator>myTVector;
如上:對于vector類型的數(shù)據(jù)結(jié)構(gòu),未加粗黑色字符是固定的(代碼中內(nèi)置string/set/vector/map四種容易類型對應(yīng)的基本字符),加粗部分T為容器的基本數(shù)據(jù)類型。IntShmAllocator是基本數(shù)據(jù)類型int對應(yīng)的分配器的別名。
用戶代碼包含生成的.h文件,然后直接使用生成好的目標(biāo)數(shù)據(jù)結(jié)構(gòu)即可,這些目標(biāo)數(shù)據(jù)結(jié)構(gòu)可以直接通過Boost Inter-Process庫應(yīng)用程序接口(API,Application Program Interface)放入共享內(nèi)存中用以存儲數(shù)據(jù),例如支持多個進程存取數(shù)據(jù),以此達到多級緩存最好的使用效果—更加安全和方便。
在共享內(nèi)存中使用上面數(shù)據(jù)結(jié)構(gòu)的方法如下:
//在共享內(nèi)存中構(gòu)造myShmVector類型的數(shù)據(jù)結(jié)構(gòu)
myShmVector*mydata=segment.construct<myShmVector>
("MyVector")(alloc_inst);
對*mydata可進行存取操作。
綜上所述,本發(fā)明實施例具有如下有益效果:
在本發(fā)明實施例中,通過開發(fā)的代碼生成裝置對用戶自定義的數(shù)據(jù)結(jié)構(gòu),(例如,前述的代碼1描述的數(shù)據(jù)結(jié)構(gòu))進行處理,形成Boost Inter-Process庫支持的、支持存放于共享內(nèi)存中的目標(biāo)數(shù)據(jù)結(jié)構(gòu)(如前述的代碼2描述的數(shù)據(jù)結(jié)構(gòu))。
由于目標(biāo)數(shù)據(jù)結(jié)構(gòu)可供Boost Inter-Process庫直接使用,因此可以通過BoostInter-Process庫在共享內(nèi)存中存儲目標(biāo)數(shù)據(jù)結(jié)構(gòu)的存儲數(shù)據(jù),避免將數(shù)據(jù)以二進制數(shù)據(jù)流的方式存儲時,由于共享內(nèi)存中存儲數(shù)據(jù)時就對應(yīng)要進行編碼和解碼而導(dǎo)致的較高的處理器的計算資源的消耗,已經(jīng)影響服務(wù)后臺的服務(wù)質(zhì)量的問題;
同時,由于可供Boost Inter-Process庫直接使用的目標(biāo)數(shù)據(jù)結(jié)構(gòu)是根據(jù)代碼生成裝置基于用戶定義的原始數(shù)據(jù)結(jié)構(gòu)自動生成的,可以節(jié)約開發(fā)者使用Boost Inter-Process庫的語法定義目標(biāo)數(shù)據(jù)結(jié)構(gòu)的過程,從而解除Boost Inter-Process庫使用時帶來的開發(fā)、維護成本高的技術(shù)壁壘。
本領(lǐng)域的技術(shù)人員可以理解:實現(xiàn)上述方法實施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成,前述的程序可以存儲于一計算機可讀取存儲介質(zhì)中,該程序在執(zhí)行時,執(zhí)行包括上述方法實施例的步驟;而前述的存儲介質(zhì)包括:移動存儲裝置、隨機存取存儲器(RAM,Random Access Memory)、只讀存儲器(ROM,Read-Only Memory)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
或者,本發(fā)明上述集成的單元如果以軟件功能模塊的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,也可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明實施例的技術(shù)方案本質(zhì)上或者說對相關(guān)技術(shù)做出貢獻的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機裝置(可以是個人計算機、服務(wù)器、或者網(wǎng)絡(luò)裝置等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分。而前述的存儲介質(zhì)包括:移動存儲裝置、RAM、ROM、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述,僅為本發(fā)明的具體實施方式,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)以所述權(quán)利要求的保護范圍為準(zhǔn)。