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

隨筆-163  評(píng)論-223  文章-30  trackbacks-0
引言
   在面向?qū)ο箢惖脑O(shè)計(jì)中,有時(shí)為了強(qiáng)化效能,特別是當(dāng)構(gòu)造大量小對(duì)象時(shí),為了改善內(nèi)存碎片,就需要自己實(shí)現(xiàn)對(duì)象的內(nèi)存管理,以替換系統(tǒng)缺省的分配和釋放行為,即全局的new和delete。按照c++標(biāo)準(zhǔn),在定制類專屬的new和delete時(shí),為了減免客戶代碼使用時(shí)的麻煩和問題,需要考慮同時(shí)定制簡(jiǎn)單(normal new)定位(placement new)無異常(nothrow new)三種new情形,以及與之配對(duì)的三種delete情形,另外還有對(duì)應(yīng)的數(shù)組new[]和delete[]各三種情形。在接口設(shè)計(jì)上,每種情形都是operator new和operator delete的重載版本;在內(nèi)存管理上,具體的對(duì)象空間分配和釋放是靈活的,因此這一部分可實(shí)現(xiàn)為策略模式,通過改變替換不同的內(nèi)存管理策略,即可輕易獲得不同的內(nèi)存分配和釋放行為,而類的代碼則無須改變。為了方便定制類的new和delete,可以從一個(gè)接口基類模板繼承而自動(dòng)獲得這種特性。這個(gè)基類模板實(shí)現(xiàn)了單個(gè)對(duì)象的new、delete和對(duì)象數(shù)組的new、delete,而模板參數(shù)正是內(nèi)存管理策略類,它的設(shè)計(jì)約束如下:
   1)必須存在static成員方法mallocfree,其參數(shù)和返回值與C庫(kù)的malloc和free一致。
   2)malloc只分配空間,若分配成功則不必初始化,否則失敗返回NULL,不能拋出異常,因?yàn)閚ormal new的語(yǔ)義為對(duì)于分配失敗則拋出std::bad_alloc異常,而nothrow new則返回NULL,如此兩種方式兼?zhèn)洌欣诳蛻舸a的按需靈活檢測(cè);free只釋放或歸還空間。
   3)malloc和free的內(nèi)部實(shí)現(xiàn)是靈活的,由應(yīng)用開發(fā)者定制。

組件
   這里實(shí)現(xiàn)了new_delete_policy_baseobject_pool_impl兩個(gè)基礎(chǔ)組件,代碼如下,前者是支持內(nèi)存管理策略的定制new和delete接口基類模板,從該類繼承的子類其對(duì)象的構(gòu)造和析構(gòu)就被定制了;后者是支持內(nèi)存管理策略的非侵入式對(duì)象池類模板,可直接用于構(gòu)造某類的對(duì)象,包括內(nèi)建的基本數(shù)據(jù)類型,而該類不必從new_delete_policy_base繼承。
 1template<class Alloc>
 2class new_delete_policy_base
 3{
 4public:
 5    static void* operator new(size_t size) throw (std::bad_alloc)
 6    {  
 7        void* ptr = Alloc::malloc(size);
 8        if(NULL==ptr) {
 9            throw std::bad_alloc();
10        }

11        return ptr;
12    }

13
14    static void* operator new(size_t size,void* ptr) throw()
15    return ptr; }
16
17    static void* operator new(size_t size,const std::nothrow_t&throw()
18    return Alloc::malloc(size); }
19
20    static void operator delete(void* ptr) throw()
21    {  Alloc::free(ptr); }
22
23    static void operator delete(void* ptr, const std::nothrow_t&throw()
24    {  Alloc::free(ptr); }
25
26    static void operator delete(void*void*throw()
27    { }
28
29    static void* operator new[](size_t size) throw(std::bad_alloc)
30    return operator new (size); }
31    
32    static void* operator new[](size_t size,void* ptr) throw()
33    return ptr; }
34
35    static void* operator new[](size_t size, const std::nothrow_t&throw()
36    return operator new (size, std::nothrow); }
37
38    static void operator delete[](void* ptr) throw()
39    {  operator delete (ptr); }
40
41    static void operator delete[](void* ptr, const std::nothrow_t&throw()
42    operator delete (ptr); }
43
44    static void operator delete[](void*void*throw()
45    { }
46}
;
47
48template<class Alloc>
49class object_pool_impl
50{
51public:
52    template<typename T>
53    static T* construct() 
54    {
55        T* const p = static_cast<T*>(Alloc::malloc(sizeof(T)));
56        try new (p) T(); }
57        catch(){ Alloc::free(p); throw; }
58        return p;
59    }

60
61    template<typename T>
62    static void destroy(T* const ptr)
63    {
64        ptr->~T();
65        Alloc::free(ptr);
66    }

67}
;

應(yīng)用
   下面代碼中的mem_pool是一種基于自由列表機(jī)制實(shí)現(xiàn)的內(nèi)存池,quick_object從new_delete_policy_base<mem_pool>繼承,用于演示定制new和delete的行為,_THROW_EXCEPTION宏用于屏蔽代碼,測(cè)試當(dāng)對(duì)象空間分配成功但構(gòu)造函數(shù)拋出異常時(shí),對(duì)應(yīng)的operator delete是否得到調(diào)用,而保證釋放內(nèi)存空間,normal_object是空類,它不從new_delete_policy_base<mem_pool>繼承,用于演示對(duì)象池構(gòu)造和銷毀對(duì)象的行為。
 1class quick_object : public new_delete_policy_base<mem_pool>
 2{
 3public:
 4    quick_object() 
 5    {
 6#ifdef _THROW_EXCEPTION
 7        throw 0;
 8#endif
 9        cout << "quick_object()" << endl;    
10    }

11    ~quick_object()
12    {
13        cout << "~quick_object()" << endl;
14    }

15}
;
16
17class normal_object
18{
19public:
20    normal_object() 
21    {
22        cout << "normal_object()" << endl;        
23    }

24    ~normal_object()
25    {
26        cout << "~normal_object()" << endl;
27    }

28}
;
29
30/**
31 *    the following code,if quick_object's construct function throw exception,then result in
32 *    c/c++ Run-time system call operator delete correspond to operator new automaticlly.
33 */

34static void unit_test_new_delete_policy()
35{    
36    quick_object* obj = NULL;
37
38    try {
39        obj = new quick_object; //call simple new
40        delete obj;             //call simple delete
41    }
catch(){
42        //call simple delete
43    }

44
45    try {
46        obj = new (std::nothrow) quick_object; //call nothrow new
47        delete obj; //call simple delete
48    }
catch(){
49        // call nothrow delete
50    }

51
52    try {
53        char ptr[sizeof(quick_object)];
54        obj = new (ptr) quick_object; //call placement new
55    }
catch(){
56        //call placement delete
57    }

58    
59    try{
60        obj = new quick_object[10]; //call simple new[]
61        delete []obj;        //call simple delete[]
62    }
catch(){
63        //call simple delete[]
64    }

65
66    try {
67        obj = new (std::nothrow) quick_object[10]; //call nothrow new[]
68        delete []obj; //call simple delete[]
69    }
catch(){
70        //call nothrow delete[]
71    }

72
73    try {
74        char ptr[sizeof(quick_object[10])];
75        obj = new (ptr) quick_object[10];    //call placement new[]
76    }
catch ({
77        //call placement delete[]
78    }

79}

80
81/**
82 *    class quick_object is inherited from class new_delete_policy_base<mem_pool> that has implement 
83 *    operator new and delete,so that call placement new in template member construct of class obj_pool.
84 */

85static void unit_test_obj_pool()
86{
87    typedef object_pool_impl<mem_pool> obj_pool;
88
89    try{
90        quick_object* obj = obj_pool::construct<quick_object>();
91        obj_pool::destroy(obj);
92    }
catch ({
93
94    }

95    //class normal_object's construct function do not throw exception.
96    normal_object* obj = obj_pool::construct<normal_object>();
97    obj_pool::destroy(obj);
98}
posted on 2012-09-27 17:37 春秋十二月 閱讀(2101) 評(píng)論(2)  編輯 收藏 引用 所屬分類: C/C++

評(píng)論:
# re: 一種簡(jiǎn)單的跨平臺(tái)信號(hào)量[未登錄] 2012-10-07 07:52 | Chipset
很好的總結(jié)  回復(fù)  更多評(píng)論
  
# re: 一種簡(jiǎn)單的跨平臺(tái)信號(hào)量 2013-02-18 14:15 | GFree_Wind
呵呵,今天剛看到你給我博客的評(píng)論。

我來回訪了呵。
我覺得跨平臺(tái)的信號(hào)量,像你這樣利用宏進(jìn)行條件編譯可以。
但是也可以自己來實(shí)現(xiàn)一個(gè)跨平臺(tái)的信號(hào)量。

  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一级二级在线| 激情久久五月| 亚洲一区二区精品在线| 亚洲国产欧美一区二区三区同亚洲 | 久久综合伊人77777尤物| 午夜精品福利一区二区蜜股av| 欧美福利专区| 久久久91精品国产一区二区三区| 亚洲综合精品四区| 久久综合久久久久88| 亚洲视频日本| 久久久综合视频| 性欧美8khd高清极品| 亚洲精品一区二区三区不| 欧美中文字幕在线播放| 日韩视频免费大全中文字幕| 精品99一区二区三区| 国产亚洲aⅴaaaaaa毛片| 国产精品二区影院| 欧美激情第10页| 欧美va天堂| 久久精品亚洲一区二区三区浴池 | 国产精品99免费看 | 亚洲一区二区三区精品视频| 美女视频网站黄色亚洲| 久久久久国内| 久久精品二区| 欧美专区福利在线| 亚洲女女做受ⅹxx高潮| 亚洲午夜久久久久久久久电影院| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲精品欧美极品| 91久久夜色精品国产网站| 国产精品自拍在线| 91久久精品国产91久久性色tv| 久久久999| 久久久综合精品| 久久手机精品视频| 久久久久欧美精品| 久久国产精品一区二区三区| 欧美一区二区国产| 久久久久久欧美| 欧美jizz19性欧美| 欧美激情影院| 99精品热6080yy久久| 亚洲毛片av在线| 一区二区三区四区五区精品| 亚洲一区二区三区视频播放| 欧美一级大片在线观看| 久久中文久久字幕| 久色成人在线| 亚洲精品影院| 在线中文字幕日韩| 久久国产99| 欧美精品一区二区三区久久久竹菊 | 亚洲激情午夜| 亚洲午夜一级| 久久国产乱子精品免费女| 久久人体大胆视频| 欧美日韩中字| 狠狠色狠狠色综合日日小说| 亚洲日本视频| 国产精品美女在线观看| 久久久中精品2020中文| 日韩视频国产视频| 欧美成黄导航| 亚洲最黄网站| 99re66热这里只有精品4| 亚洲私人影院在线观看| 久久久久国内| 国产精品亚洲一区| 一区二区三区欧美在线观看| 欧美在线观看一区二区| 亚洲第一主播视频| 先锋资源久久| 欧美黄色aa电影| 国产一区二区三区在线观看精品| 亚洲人午夜精品| 久久精品久久综合| 夜夜爽av福利精品导航| 麻豆成人91精品二区三区| 国产精品视频xxxx| 亚洲午夜激情免费视频| 欧美激情网站在线观看| 国产欧美日韩在线视频| 亚洲激情一区二区| 久久久精品国产免大香伊| 日韩亚洲在线观看| 欧美成人精品在线| 1024成人| 久久成人在线| 亚洲伊人久久综合| 国产精品av久久久久久麻豆网| 韩国欧美一区| 久久免费视频在线观看| 亚洲欧美资源在线| 国产精品第三页| 亚洲综合三区| 亚洲视频一二| 欧美日韩精品是欧美日韩精品| 尤物网精品视频| 久久综合九色99| 久久精品女人的天堂av| 精品成人久久| 欧美成人激情视频免费观看| 欧美永久精品| 国产一区二区三区直播精品电影| 亚洲女人av| 亚洲欧美视频在线观看| 国产视频亚洲精品| 久久久国产一区二区| 久久激情五月丁香伊人| 一区二区三区在线高清| 美女脱光内衣内裤视频久久网站| 久久久久久久久久看片| 亚洲黄页一区| 亚洲美女黄色片| 国产精品日韩欧美一区二区| 欧美一区二区| 久久婷婷av| 99国产精品久久久久久久| 亚洲另类在线视频| 国产精品拍天天在线| 老司机aⅴ在线精品导航| 欧美阿v一级看视频| 亚洲图色在线| 午夜亚洲性色福利视频| 激情久久综艺| 亚洲日本电影| 国产日韩欧美麻豆| 亚洲片国产一区一级在线观看| 欧美特黄一级大片| 久久久综合网站| 欧美日韩一区二区三区在线看| 亚洲欧美国产精品va在线观看 | 亚洲精品欧美日韩专区| 欧美三级精品| 久久噜噜亚洲综合| 欧美成人久久| 欧美在线视频在线播放完整版免费观看 | 亚洲欧洲午夜| 亚洲色在线视频| 亚洲欧美中日韩| 亚洲精品黄网在线观看| 亚洲一区在线视频| 亚洲伦理自拍| 欧美在线黄色| 一本久久精品一区二区| 久久精品99| 亚洲欧美日韩另类| 久久综合影视| 亚洲欧美日韩专区| 另类图片国产| 欧美在线视频日韩| 欧美日韩精品一区视频| 欧美成人激情视频免费观看| 国产精品久久二区二区| 亚洲大胆在线| 国产一区二区三区高清 | 亚洲神马久久| 在线观看欧美亚洲| 亚洲一区二区在线看| 99国产精品99久久久久久粉嫩| 欧美一区二区在线播放| 亚洲尤物在线视频观看| 久久久国产亚洲精品| 国产专区精品视频| 久久精品一区二区三区四区| 亚洲一区二区黄色| 国产丝袜一区二区| 男女精品网站| 欧美日韩亚洲高清一区二区| 亚洲第一综合天堂另类专| 黄色一区二区三区| 午夜在线视频一区二区区别| 亚洲一区中文| 国产精品久久久久久久久免费桃花| 亚洲成色www8888| 亚洲精品一区二区在线| 亚洲深夜福利| 欧美激情一级片一区二区| 欧美h视频在线| 国产亚洲欧美一级| 久久精品一区| 欧美承认网站| 亚洲激情午夜| 欧美激情一区二区三区在线视频观看| 免费亚洲电影在线| 亚洲国产小视频在线观看| 久久精品夜夜夜夜久久| 另类激情亚洲| 亚洲国产精品电影在线观看| 久久免费精品视频| 欧美不卡视频一区发布| 亚洲欧洲日本一区二区三区| 欧美成在线观看| 99热精品在线| 久久国产福利| 在线观看一区欧美| 欧美剧在线免费观看网站|