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

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

組件
   這里實現了new_delete_policy_baseobject_pool_impl兩個基礎組件,代碼如下,前者是支持內存管理策略的定制new和delete接口基類模板,從該類繼承的子類其對象的構造和析構就被定制了;后者是支持內存管理策略的非侵入式對象池類模板,可直接用于構造某類的對象,包括內建的基本數據類型,而該類不必從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}
;

應用
   下面代碼中的mem_pool是一種基于自由列表機制實現的內存池,quick_object從new_delete_policy_base<mem_pool>繼承,用于演示定制new和delete的行為,_THROW_EXCEPTION宏用于屏蔽代碼,測試當對象空間分配成功但構造函數拋出異常時,對應的operator delete是否得到調用,而保證釋放內存空間,normal_object是空類,它不從new_delete_policy_base<mem_pool>繼承,用于演示對象池構造和銷毀對象的行為。
 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 春秋十二月 閱讀(2093) 評論(2)  編輯 收藏 引用 所屬分類: C/C++

評論:
# re: 一種簡單的跨平臺信號量[未登錄] 2012-10-07 07:52 | Chipset
很好的總結  回復  更多評論
  
# re: 一種簡單的跨平臺信號量 2013-02-18 14:15 | GFree_Wind
呵呵,今天剛看到你給我博客的評論。

我來回訪了呵。
我覺得跨平臺的信號量,像你這樣利用宏進行條件編譯可以。
但是也可以自己來實現一個跨平臺的信號量。

  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品xxx在线观看www| 亚洲午夜久久久久久久久电影院| 欧美精品一区在线| 在线视频你懂得一区| 日韩亚洲欧美成人| 一片黄亚洲嫩模| 亚洲一区二区三区高清| 中日韩视频在线观看| 亚洲一区免费| 久久偷窥视频| 欧美激情一区二区三区成人| 亚洲欧洲日产国产网站| 亚洲精品国产精品国自产观看浪潮| 亚洲欧洲日产国码二区| 中文av一区特黄| 久久精品国产一区二区三区| 欧美二区不卡| 国产精品自拍三区| 亚洲精品午夜精品| 欧美亚洲视频在线观看| 亚洲高清久久网| 亚洲欧美视频在线观看| 欧美aa国产视频| 国产日本欧美一区二区| 91久久香蕉国产日韩欧美9色 | 久久青青草综合| 欧美日韩成人一区| 樱桃国产成人精品视频| 亚洲综合导航| 亚洲国产成人av在线| 亚洲欧美在线一区二区| 欧美另类女人| 影音先锋久久资源网| 亚洲性视频网址| 欧美国产一区二区在线观看| 亚洲愉拍自拍另类高清精品| 欧美jjzz| 1769国产精品| 久久激情五月激情| 一本色道综合亚洲| 欧美高清在线播放| 国产在线播放一区二区三区| 亚洲午夜国产一区99re久久| 亚洲国产精品成人久久综合一区| 欧美在线不卡| 国产欧美午夜| 午夜天堂精品久久久久| 亚洲美女精品一区| 另类人畜视频在线| 在线观看国产日韩| 免费成人性网站| 久久嫩草精品久久久精品| 国产一区二区三区四区| 欧美一区国产二区| 亚洲欧美一区二区精品久久久| 欧美日韩成人综合在线一区二区| 亚洲黄色天堂| 欧美福利电影网| 久久久五月婷婷| 久久精品视频在线播放| 一区二区冒白浆视频| 欧美激情视频一区二区三区免费| 在线观看国产欧美| 欧美成人精品一区二区| 久久色在线观看| 亚洲国产精品123| 亚洲缚视频在线观看| 免费观看国产成人| 亚洲精品美女91| 亚洲国产另类久久精品| 欧美精品一区二区精品网| 亚洲乱码国产乱码精品精| 亚洲人体影院| 国产精品乱子乱xxxx| 欧美一区二区视频在线| 欧美伊人久久| 亚洲高清视频在线观看| 亚洲第一伊人| 欧美性片在线观看| 久久国产精品99国产| 久久久成人精品| 亚洲精品小视频| 亚洲天堂免费观看| 激情五月婷婷综合| 亚洲人永久免费| 国产伦精品一区二区三区照片91| 欧美伊人久久| 麻豆成人在线观看| 一区二区三区四区国产精品| 亚洲一区国产视频| 在线观看亚洲视频| 亚洲久久一区二区| 国产一区二区精品久久91| 亚洲国产精品视频| 国产欧美亚洲精品| 91久久精品国产91久久性色| 国产精品一区二区三区观看| 欧美激情91| 国产亚洲精品美女| 99国产精品99久久久久久粉嫩| 国产亚洲一区在线播放| 日韩视频永久免费观看| 国内一区二区三区| 一区二区久久| 亚洲久色影视| 久久久99国产精品免费| 亚洲欧美日韩国产中文| 欧美成人伊人久久综合网| 欧美在线一级视频| 欧美日韩和欧美的一区二区| 美女国产精品| 国产一区二区中文| 亚洲一区二区不卡免费| 亚洲精品日韩精品| 久久免费黄色| 久久久久国产精品一区三寸| 国产精品久久久久影院色老大| 欧美激情在线狂野欧美精品| 国产在线观看91精品一区| 一区二区三区日韩精品| 日韩视频久久| 欧美激情精品| 国产综合久久久久影院| 亚洲无限av看| 亚洲影院污污.| 欧美激情一区在线| 亚洲第一区色| 亚洲人成网站在线观看播放| 久久久久久久一区二区| 久久精品国产清高在天天线 | 亚洲国产经典视频| 久久久99爱| 久久综合九色| 影音欧美亚洲| 猛干欧美女孩| 亚洲电影在线播放| 亚洲美女在线视频| 欧美精品亚洲二区| 一区二区久久| 午夜性色一区二区三区免费视频| 欧美亚洲第一页| 亚洲婷婷综合久久一本伊一区| 亚洲一区二区四区| 国产欧美日韩综合一区在线观看 | 亚洲欧美日韩精品久久| 亚洲欧美激情四射在线日 | 亚洲电影欧美电影有声小说| 久久露脸国产精品| 欧美 日韩 国产 一区| 亚洲国产精彩中文乱码av在线播放| 久久久久中文| 亚洲第一精品电影| 国产精品99久久久久久有的能看 | 美国成人毛片| 亚洲日本无吗高清不卡| 亚洲在线观看视频网站| 国产精品一级在线| 久久久久免费视频| 亚洲免费激情| 香蕉久久夜色精品国产| 尤妮丝一区二区裸体视频| 欧美国产一区二区三区激情无套| 亚洲精品小视频在线观看| 亚洲欧洲99久久| 精品69视频一区二区三区| 欧美国产欧美亚州国产日韩mv天天看完整| 亚洲激情小视频| 性欧美video另类hd性玩具| 在线成人av| 欧美视频日韩视频| 久久久久久久一区二区| 一本色道久久综合精品竹菊| 久久嫩草精品久久久久| 一区二区三区视频免费在线观看| 国产精品网曝门| 国产精品白丝jk黑袜喷水| 国产精品一级在线| 久久蜜臀精品av| 一区二区三区视频在线观看 | 99精品欧美一区二区蜜桃免费| 国产精品久久福利| 噜噜噜在线观看免费视频日韩 | 欧美成人激情视频| 亚洲欧美日韩在线播放| 亚洲欧洲日产国产综合网| 久久精品人人做人人综合| 99视频一区| 在线看国产日韩| 国产美女扒开尿口久久久| 欧美日韩国产精品专区| 免费高清在线视频一区·| 午夜一区二区三区在线观看 | 一区二区三区成人精品| 欧美a级一区| 久久精品国产清高在天天线 | 亚洲乱码国产乱码精品精98午夜| 久久亚洲午夜电影| 香蕉免费一区二区三区在线观看| 一区二区av在线| 亚洲精品综合精品自拍|