青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 94, comments - 250, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

核心子系統(tǒng)

核心庫(Core namespace)實(shí)現(xiàn)了這些特性:

  • 一個實(shí)現(xiàn)了引用計數(shù)的RefCounted基類
  • 一個運(yùn)行時類型信息系統(tǒng)(RTTI)
  • 一個模板智能指針, 用于處理RefCounted對象的生命周期
  • 一個由類名創(chuàng)建C++對象實(shí)例的工廠機(jī)制
  • 一個中央Server對象用于建立基本的Nebula3運(yùn)行環(huán)境

對象模型

Nebula3在C++對象模型的基礎(chǔ)之上實(shí)現(xiàn)了下面這些新特性:

  • 基于引用計數(shù)和智能指針的生命周期管理
  • 基于類名或四字符編碼的對象創(chuàng)建
  • 一個運(yùn)行時類型信息系統(tǒng)

實(shí)現(xiàn)一個新的Nebula3類

當(dāng)實(shí)現(xiàn)一個新的類時首先要考慮它是一個傳統(tǒng)的C++類還是要從Core::RefCounted繼承. 以下幾點(diǎn)可以幫你找到答案:

  • 如果這個類需要使用Nebula3的擴(kuò)展對象特性, 如引用計數(shù), RTTI等, 則它必須從Core::RefCounted繼承.
  • 如果這個類是一個典型的小工具類, 如動態(tài)數(shù)組, 數(shù)學(xué)向量, 或其它相似的東西, 那么它從Core::RefCounted 繼承也沒有什么意義.

從Core::RefCounted類繼承有一些限制:

  • RefCounted派生類不應(yīng)該在棧上創(chuàng)建對象, 因?yàn)闂ο蟮纳芷谑怯蒀++來管理的(他們會在離開當(dāng)前上下文時被銷毀, 從而繞過了Nebula3的引用計數(shù)生命周期 管理)
  • RefCounted的派生類只有一個默認(rèn)的構(gòu)造函數(shù).
  • RefCounted的派生類必須有一個虛析構(gòu)函數(shù).
  • RefCounted的派生類不能進(jìn)行拷貝, 因?yàn)檫@樣會造成引用計數(shù)機(jī)制混亂.

要使用Nebula3的對象模型特性, 除了需要從Core::RefCounted繼承外, 還需要在頭文件新類的聲明中進(jìn)行額外的標(biāo)注:

一個標(biāo)準(zhǔn)的RefCounted派生類一般這樣聲明:

1: namespace MyNamespace

2: {

3: class MyClass : public Core::RefCounted

4: {

5: DeclareClass(MyClass);

6: public:

7: /// constructor

8:     MyClass();

9: /// destructor

10: virtual ~MyClass();

11: ...

12: };

13: RegisterClass(MyClass);

注意DeclareClass()宏, 構(gòu)造函數(shù), 析構(gòu)函數(shù)還有類外面的RegisterClass()宏. DeclareClass()宏加入了RTTI和工廠機(jī)制所需的最小代價的信息, 它隱藏了Nebula3的對象模型, 希望可以在不影響已有類的基礎(chǔ)進(jìn)上進(jìn)行內(nèi)部機(jī)制的變更. RegisterClass()宏是可選的, 它把當(dāng)前類在中央工廠進(jìn)行注冊. 如果你知道這個類永遠(yuǎn)不會由類名或四字符編碼進(jìn)行創(chuàng)建, 這個宏可以省略.

在這個類的.cpp文件里需要包含Nebula3特有的信息:

1: namespace MyNamespace

2: {

3: ImplementClass(MyNamespace::MyClass, 'MYCL', Core::RefCounted);

4:

5: }

ImplementClass()宏注冊類的RTTI機(jī)制, 第一個參數(shù)描述了類的名字(注意命名空間必須包含). 第二個參數(shù)是類的四字符編碼, 它必須是所有類中唯一的(如果有重復(fù), 你會在啟動程序時得到一個錯誤提示). 第三個參數(shù)是父類的名字, 用于RTTI系統(tǒng)去構(gòu)造類的關(guān)系樹.

引用計數(shù)和智能指針

Nebula3使用傳統(tǒng)的引用計數(shù)來管理對象的生命周期. 一個模板智能指針類Ptr<>對程序員隱藏了引用計數(shù)的實(shí)現(xiàn)細(xì)節(jié). 一般來說, 應(yīng)該一直使用智能指針指向RefCounted的派生對象, 除非你能肯定在給出的代碼塊中這個對象的引用計數(shù)不會發(fā)生變化.

智能指針相對于一般指針有很多好處:

  • 訪問一個空指針會給你一個斷言警告而不是一個內(nèi)存錯誤
  • 你不需要對引用計數(shù)的對象調(diào)用AddRef()或Release() (事實(shí)上如果你調(diào)了, 會了發(fā)生嚴(yán)重的錯誤)
  • 智能指針可以在容器類里良好地工作, 一個智能指針的數(shù)組會消除所有的一般指針需要的生命周期管理, 你永遠(yuǎn)不需要考慮去釋放指針?biāo)羔樀膶ο? 數(shù)組包含的像是真正的C++對象一樣
  • 用智能指針不需要考慮指針的所屬, 不需要為誰delete對象而煩惱

智能指針也有一些缺點(diǎn):

  • 性能: 拷貝和賦值會引起對象的引用計數(shù)的變化, 解除引用會引起指針的斷言檢查. 這導(dǎo)致的性能消耗一般是可以忽略的, 但是你最好保證它不在內(nèi)部循環(huán)中發(fā)生.
  • 應(yīng)該銷毀的對象還存在: 因?yàn)橹悄苤羔樄芾淼膶ο笾挥性谧詈笠粋€引用放棄時才會銷毀, 這樣會使對象存在超過預(yù)訂的時間. 這經(jīng)常會導(dǎo)致一個BUG的產(chǎn)生. 不過引用計數(shù)泄露(程序退出時還仍然存在的對象)時Nebula3會提醒你.

創(chuàng)建Nebula3對象

從Core::RefCounted繼承的類可以通過3種不同的方式進(jìn)行創(chuàng)建:

直接通過靜態(tài)的Create方法:

1: Ptr<MyClass> myObj = MyClass::Create();

靜態(tài)的Create()方法是之前提到的DeclareClass()宏加入的, 相對于new操作符來說, 它并沒有多做什么. 注意正確使用智能指針來保存新建的對象.

另一種創(chuàng)建方式是通過類名:

1: using namespace Core;

2: Ptr<MyClass> myObj = (MyClass*)Factory::Instance()->Create("MyNamespace::MyClass");

當(dāng)你在運(yùn)行時通過類名來創(chuàng)建十分有用, 特別是對象的反序列化和腳本接口的使用. 注意類型轉(zhuǎn)換是必須的, 因?yàn)楣S的Creat()方法返回的是RefCounted指針.

由類名創(chuàng)建的變種是根據(jù)四字符編碼進(jìn)行創(chuàng)建:

1: using namespace Core;

2: using namespace Util;

3: Ptr<MyClass> myObj = (MyClass*) Factory::Instance()->Create(FourCC('MYCL'));

這個方法看上去沒有那個直觀, 但是它比類名創(chuàng)建快得多. 并且四字符編碼比類名占用的空間更少, 這更利于對象寫入二進(jìn)制流或從中讀取.

運(yùn)行時類型信息系統(tǒng)

Nebula3的RTTI系統(tǒng)可以讓你在運(yùn)行時訪問對象的類型, 檢查一個對象是不是某個類的實(shí)例, 或者某個派生類的實(shí)例. 你也可以直接獲得一個對象的類名和四字符編碼. 所有這些功能是由DeclareClass() 和 ImplementClass() 宏在背后實(shí)現(xiàn)的.

這時有示例程序:

1:     using namespace Util;

2:     using namespace Core;

3:

4: // check whether an object is instance of a specific class

5: if (myObj->IsInstanceOf(MyClass::RTTI))

6: {

7: // it's a MyClass object

8: }

9:

10: // check whether an object is instance of a derived class

11: if (myObj->IsA(RefCounted::RTTI))

12: {

13: // it's a RefCounted instance or some RefCounted-derived instance

14: }

15:

16: // get the class name of my object, this yields "MyNamespace::MyClass"

17: const String& className = myObj->GetClassName();

18:

19: // get the fourcc class identifier of my object, this yields 'MYCL'

20: const FourCC& fourcc = myObj->GetClassFourCC();

你也可以向中央工廠查詢一個類是否已經(jīng)注冊:

1:     using namespace Core;

2:

3: // check if a class has been registered by class name

4: if (Factory::Instance()->ClassExists("MyNamespace::MyClass"))

5: {

6: // yep, the class exists

7: }

8:

9: // check if a class has been registered by class fourcc code

10: if (Factory::Instance()->ClassExists(FourCC('MYCL')))

11: {

12: // yep, the class exists

13: }

Nebula3單件

很多Nebula3的核心對象都是單件, 就是只存在一個實(shí)例, 并且所有其它對象都知道它.

你可以通過靜態(tài)方法Instance()來訪問單件, 它返回唯一實(shí)例的一個指針. 返回的指針保證是合法的. 如果在調(diào)用Instance()方法時對象實(shí)例不存在, 一個斷點(diǎn)會被拋出:

1: // obtain a pointer to the Core::Server singleton

2:     Ptr<Core::Server> coreServer = Core::Server::Instance();

你也可以檢查單件是否存在:

1: // does the Core::Server object exist?

2: if (Core::Server::HasInstance())

3: {

4: // yep, the core server exists

5: }

Nebula3提供了一些輔助的宏來實(shí)現(xiàn)單件:

1: // declare a singleton class

2: class MySingletonClass : public Core::RefCounted

3: {

4: DeclareClass(MySingletonClass);

5: DeclareSingleton(MySingletonClass);

6: public:

7: /// constructor

8:     MySingletonClass();

9: /// destructor

10: virtual ~MySingletonClass();

11: ...

12: };

13:

14: // implement the singleton class

15: ImplementClass(MyNamespace::MySingletonClass, 'MYSC', Core::RefCounted);

16: ImplementSingleton(MyNamespace::MySingletonClass);

17:

18: //------------------------------------------------------------------------------

19: /**

20:     Implements the Singleton constructor.

21: */

22: MySingletonClass::MySingletonClass()

23: {

24: ConstructSingleton;

25: }

26:

27: //------------------------------------------------------------------------------

28: /**

29:     Implements the Singleton destructor.

30: */

31: MySingletonClass:~MySingletonClass()

32: {

33: DestructSingleton;

34: }

DeclareSingleton()和ImplementSingleton()宏跟DeclareClass()和ImplementClass()宏差不多.它們在類中添加了一些靜態(tài)方法(也就是Instance()和HasInstance()). 類的構(gòu)造函數(shù)和析構(gòu)函數(shù)必須包含ConstructSingletonDestructSingleton宏. ContructSingleton初始化了一個私有的單件指針并保證沒有其它的類實(shí)例存在(如果不是, 會拋出斷言). DestructSingleton讓私有的單件指針無效化.

單件的訪問默認(rèn)是只有本地線程. 這意味著在一個線程中創(chuàng)建的單件無法被其他線程訪問. 這使得”并行Nebula”大大簡化了多線程編程. “并行Nebula”的基本思想是, 一個典型的Nebula3應(yīng)用程序包含一些”Fat線程”, 每一個Fat線程都是運(yùn)行在一個單獨(dú)的CPU核心上. Fat線程可以用于實(shí)現(xiàn)異步IO, 渲染, 物理等等. 每一個Fat線程都初始化了它們自己的Nebula3運(yùn)行環(huán)境, 它們執(zhí)行特性任務(wù)所需的最少依賴. 這基本上消除了大部分Nebula3代碼的同步問題, 并且把線程相關(guān)的代碼集中到一個明確定義的代碼區(qū)域中. “并行Nebula”的另一個好處就是, 程序員在多線程環(huán)境中編程時不需要關(guān)心太多. 大多數(shù)Nebula3代碼看起來就像單線程代碼一樣, 但是它們卻運(yùn)行在各自的Fat線程中.

性能與內(nèi)存占用的考慮

Nebula3核心層的一個設(shè)計目標(biāo)就是減少底層代碼的內(nèi)存占用, 來更好的適應(yīng)微型平臺, 像手持設(shè)備. 這里有一些已經(jīng)完成的目標(biāo):

  • RefCounted 類在每個實(shí)例中只增加了4byte用于引用計數(shù).
  • RTTI機(jī)制在開頭增加了30 到 60 byte, 但是這是對于每個類來說的, 而是不是每個實(shí)例.
  • 一個智能指針僅僅4 byte, 就像普通指針一樣.
  • 一些監(jiān)控結(jié)構(gòu)只會在debug模型下創(chuàng)建, 特別是用來檢測引擎計數(shù)泄露的RefCountedList.

這里一些用三種不種的創(chuàng)建方法創(chuàng)建一百萬個RefCounted 對象所需的時間信息. 這些時間信息是在臺Intel Pentium 800 MHz的筆記本上得出的.  

  • Create(): 0.29 seconds
  • FourCC: 0.65 seconds
  • 類名: 1.45 seconds

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品九九| 91久久综合| 亚洲三级免费观看| 日韩一区二区精品在线观看| 欧美日韩国产精品专区| 亚洲午夜av电影| 久久久另类综合| 亚洲资源在线观看| 你懂的亚洲视频| 国产精品亚洲аv天堂网| 影音先锋日韩精品| 99精品久久久| 亚洲激情成人网| 久久aⅴ国产紧身牛仔裤| 国产三级精品三级| 午夜视频久久久久久| 久久综合伊人| 久久裸体视频| 国产在线一区二区三区四区| 亚洲免费视频一区二区| 欧美电影免费观看网站| 国产精品国产三级国产普通话三级| 欧美日韩精品久久| 亚洲精品网站在线播放gif| 亚洲影院一区| 亚洲国产乱码最新视频| 欧美日韩视频不卡| 久久欧美中文字幕| 中文日韩在线视频| 亚洲精品国精品久久99热一| 午夜精品免费在线| 夜夜爽99久久国产综合精品女不卡| 国产日韩欧美夫妻视频在线观看| 久久综合久色欧美综合狠狠 | 欧美高清在线播放| 午夜精品99久久免费| 亚洲精品一二| 在线观看成人小视频| 国产精一区二区三区| 欧美日韩亚洲91| 欧美精品久久一区二区| 美女尤物久久精品| 免费成人美女女| 免费日韩av电影| 欧美激情久久久| 欧美激情一区在线| 欧美日韩一区二区在线播放| 欧美二区在线播放| 欧美日韩国产免费| 欧美色图首页| 国产伦精品一区二区三区| 国产老肥熟一区二区三区| 国产精品久久久久国产精品日日| 国产精品久久福利| 亚洲人成网站在线播| 乱人伦精品视频在线观看| 欧美国产精品久久| 日韩一级黄色大片| 久久精品日产第一区二区三区 | 一区二区三区日韩欧美| 亚洲免费在线视频| 久久久噜噜噜| 亚洲免费成人| 久久夜色精品| 国产精品久久久久久久电影| 狠狠色噜噜狠狠色综合久| 亚洲理论电影网| 久久亚洲私人国产精品va媚药| 欧美成va人片在线观看| 亚洲一区二区免费看| 欧美电影免费| 精品51国产黑色丝袜高跟鞋| 一本色道精品久久一区二区三区 | 亚洲成人在线视频播放| 伊人春色精品| 亚洲在线播放| 亚洲精品日韩综合观看成人91| 中文亚洲字幕| 欧美视频在线观看免费网址| 在线看一区二区| 亚洲深夜激情| 亚洲欧美日韩国产另类专区| 久久青青草综合| 午夜国产精品视频| 性8sex亚洲区入口| 亚洲韩日在线| 老鸭窝毛片一区二区三区| 亚洲亚洲精品三区日韩精品在线视频| 久久久国产精品一区二区中文 | 蜜桃av一区二区| 亚洲欧美日韩网| 国产午夜精品视频免费不卡69堂| 亚洲人体一区| 亚洲欧美国产精品专区久久| 亚洲黄色成人久久久| 久久亚洲影音av资源网| 亚洲国产精品成人综合色在线婷婷| 亚洲清纯自拍| 欧美日韩亚洲综合在线| 亚洲综合视频网| 欧美成人有码| 小辣椒精品导航| 亚洲激情电影中文字幕| 国产精品久久久99| 久久一二三区| 亚洲一区二区在线免费观看| 久久亚洲影院| 亚洲欧美日韩综合国产aⅴ| 激情小说另类小说亚洲欧美| 欧美日韩免费| 麻豆av一区二区三区| 亚洲一区二区三区乱码aⅴ| 亚洲成人直播| 久久一区二区精品| 欧美一区二区视频在线| 99视频在线精品国自产拍免费观看| 国产日韩精品一区| 欧美亚洲成人免费| 欧美寡妇偷汉性猛交| 久久精品在这里| 午夜精品久久久久久久久久久久久| 亚洲欧洲日韩女同| 欧美成人亚洲成人| 久久久久国产精品一区三寸| 亚洲欧美文学| 亚洲午夜一区二区| 99综合精品| 亚洲精品视频啊美女在线直播| 国产一区91| 国产日韩精品一区二区三区 | 国产精品yjizz| 美女视频网站黄色亚洲| 久久精品30| 校园春色国产精品| 亚洲精品社区| 亚洲欧洲精品一区二区| 欧美高清视频| 欧美黄色免费网站| 美女网站久久| 欧美国产91| 亚洲高清免费| 亚洲精品久久久久久久久久久久久| 欧美成人精品在线| 欧美激情亚洲综合一区| 欧美成人午夜77777| 欧美xart系列在线观看| 欧美高清成人| 亚洲精选国产| 在线视频精品| 香蕉久久夜色精品国产使用方法| 香蕉久久夜色| 蜜臀va亚洲va欧美va天堂| 欧美激情中文字幕在线| 欧美精品一区二区三区蜜桃| 欧美日韩国产在线看| 国产精品成人免费精品自在线观看| 国产精品地址| 黑丝一区二区| 日韩视频永久免费观看| 亚洲色图制服丝袜| 午夜在线成人av| 免费91麻豆精品国产自产在线观看| 欧美电影免费观看网站| 欧美专区亚洲专区| 久久久久久免费| 欧美激情精品久久久久久黑人 | 欧美一级大片在线观看| 久久精品青青大伊人av| 牛牛影视久久网| 欧美视频久久| 一区精品在线| 一本色道久久88综合日韩精品| 亚洲一区二区三区四区视频| 欧美在线视频导航| 亚洲电影在线| 午夜精品久久久久久久蜜桃app| 久久综合久久综合久久| 欧美日韩一区二区在线| 国产综合亚洲精品一区二| 99精品国产在热久久| 欧美一区国产二区| 亚洲国产成人久久综合| 亚洲欧美日韩一区二区在线| 免费欧美网站| 国产午夜久久久久| 日韩网站在线看片你懂的| 欧美一级免费视频| 亚洲国产精品一区二区www在线 | 久久久久久久久蜜桃| 亚洲另类视频| 免费看成人av| 国产一区在线视频| 亚洲综合视频一区| 亚洲高清在线| 久久久久久久综合色一本| 国产欧美日韩不卡| 亚洲图片欧美一区| 亚洲国产精品一区二区www| 久久久久久久波多野高潮日日| 国产精品久久久久99|