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

CG@CPPBLOG

/*=========================================*/
隨筆 - 76, 文章 - 39, 評論 - 137, 引用 - 0
數(shù)據(jù)加載中……

《C++設(shè)計新思維》讀書筆記(23)

4.4 Chunks(大塊內(nèi)存)

每個Chunk對象包含并管理一大塊內(nèi)存,其中包含固定數(shù)量的區(qū)塊。你可以在構(gòu)造期間設(shè)定區(qū)塊的大小和數(shù)量。你可以從chunk中分配和歸還區(qū)塊。一旦chunk之中沒有剩余區(qū)塊,分配函數(shù)便傳回0chunk定義如下:

// Nothing is private - Chunk is a Plain Old Data (POD) structure
// structure defined inside FixedAllocator
// and manipulated only by it
struct Chunk{
    
void Init(std::size_t blockSize, unsigned char blocks);
    
void Release();
    
void* Allocate(std::size_t blockSize);
    
void Deallocate(void* p, std::size_t blockSize);
    unsigned 
char* pData_;
    unsigned 
char
        firstAvailableBlock_,
        blocksAvailable_;
};

除了一個指針指向被管理內(nèi)存本身,firstAvailableBlock_保存chunk內(nèi)第一個可用區(qū)塊的索引,blocksAvailable_保存chunk內(nèi)可用區(qū)塊總數(shù)。

Chunk的接口非常簡單。Init()用于初始化,Release()用來釋放。Allocate()用來分配,Deallocate()用來歸還。Chunk不保存區(qū)塊的大小,它沒有構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值運算符,定義自己的copy語義會損及上一層的效率——上一層將chunk置于一個vector

chunk的結(jié)構(gòu)反應(yīng)出設(shè)計中一個重要折衷。blocksAvailable_firstAvailableBlock_都是unsigned char型別,因此一個chunk無法擁有255個以上的區(qū)塊。

另外我們利用未被使用的區(qū)塊的第一個bytes來存放下一個未被使用的區(qū)塊的索引號。這樣我們就擁有了一個單向鏈表。無需占用內(nèi)存。

初始化函數(shù)如下:

void Chunk::Init(std::size_t blockSize, unsigned char blocks){
    pData_ 
= new unsigned char[blockSize * blocks];
    firstAvailableBlock_ 
= 0;
    blocksAvailable_     
= blcoks;
    unsigned 
char i      = 0;
    unsigned 
char* p     = pData_;
    
for(; i != blocks; p += blockSize){
        
*= ++i;
    }
}

我們來看一下將區(qū)塊數(shù)量限制在unsigned char的大小(0~255)的原因。假如我們使用一個較大型別,比如unsigned short0~65535),我們將遭遇兩個問題,一個小問題,一個大問題。

小問題是我們無法分配小于sizeof(unsigned short)的區(qū)塊,這令人尷尬,因為我們正在建立一個小型對象分配器。(這里指的是,對于1 byte區(qū)塊大小的chunk,由于索引號有2 bytes,無法建立內(nèi)嵌的單向鏈表,cuigang)。

大問題是齊位(alignment)問題。假設(shè)你為一個5 bytes區(qū)塊建立一個專屬分配器。這種情況下如果想將指向如此一個5 bytes區(qū)塊的指針轉(zhuǎn)換為unsigned int(原文如此,估計作者是想說從一個起始為奇地址的區(qū)塊提領(lǐng)(dereference)一個偶字節(jié)變量會導(dǎo)致異常的問題,這幾個函數(shù)中都有提領(lǐng)的動作。cuigang),會造成不確定行為。

unsigned char類型可以簡單的解決這個問題。它大小為1,無齊位問題。只不過我們將無法分配多于255的區(qū)塊。但這個我們是可以接受的。

分配函數(shù)Allocate()是典型的list操作。

void* Chunk::Allocate(std::size_t blockSize){
    
if(!blocksAvailable_) return 0;
    unsigned 
char* pResult =
        pData_ 
+ (firstAvailableBlock_ * blockSize);
    firstAvailableBlock_ 
= *pResult;
    
--blocksAvailable_;
    
return pResult;
};

這個函數(shù)成本很小,不需要查找動作,在常數(shù)事件內(nèi)完成,而不像系統(tǒng)分配需要線性時間。

歸還函數(shù)Deallocate()行為相反,這里要注意,由于Chunk對區(qū)塊大小一無所知,所以你必須將區(qū)塊大小當(dāng)作參數(shù)傳入,同時注意里面很多的異常處理來避免你將錯誤指針傳入:

void Chunk::Deallocate(void* p, std::size_t blockSize){
    assert(p 
>= pData_);
    unsigned 
char* toRelease = static_cast<unsigned char*>(p);
    assert((toRelease 
- pData_) % blockSize == 0);
    
*toRelease = firstAvailableBlock_;
    firstAvailableBlcok_ 
= static_cast<unsigned char>(
        (toRelease 
- pData_) / blockSize);
    assert(firstAvailableBlock 
== (toRelease - pData_) / blockSize);
    
++blocksAvailable_;
};


posted on 2008-01-12 20:29 cuigang 閱讀(659) 評論(0)  編輯 收藏 引用 所屬分類: 《C++設(shè)計新思維》讀書筆記

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美国产三区| 欧美激情免费观看| 韩日欧美一区| 国产视频在线一区二区| 国产精品丝袜白浆摸在线| 国产欧美日韩三级| 精品1区2区| 99精品福利视频| 午夜精品免费| 免费日韩精品中文字幕视频在线| 麻豆成人精品| 亚洲人午夜精品免费| 亚洲精品一区二区三区福利| 一区二区三区国产在线| 亚洲欧美在线视频观看| 老司机久久99久久精品播放免费| 欧美激情在线狂野欧美精品| 国产精品久久一卡二卡| 伊人久久噜噜噜躁狠狠躁| 99精品国产高清一区二区| 小嫩嫩精品导航| 欧美激情在线狂野欧美精品| 亚洲国产日韩综合一区| 免费人成网站在线观看欧美高清| 欧美激情久久久久久| 亚洲无线一线二线三线区别av| 欧美在线亚洲| 欧美三级在线视频| 国语自产精品视频在线看| 亚洲精品美女在线观看| 久久福利资源站| 亚洲人永久免费| 久久国产精品久久精品国产| 欧美色网一区二区| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲国产精品激情在线观看| 亚洲男女自偷自拍图片另类| 免费视频一区二区三区在线观看| 国产精品爽黄69| 亚洲午夜精品视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美亚洲视频一区二区| 亚洲国产午夜| 久久女同精品一区二区| 国产一区二区久久| 欧美一区二区三区四区视频| 亚洲美女毛片| 欧美aaa级| 亚洲黄色免费网站| 模特精品在线| 久久一区二区三区国产精品| 国产综合激情| 久久久激情视频| 亚洲欧美一区在线| 国产精品免费视频xxxx| 亚洲欧美日韩中文播放| 一二三区精品福利视频| 欧美成人激情在线| 亚洲区欧美区| 亚洲国内自拍| 欧美日韩高清一区| 亚洲九九精品| 99pao成人国产永久免费视频| 欧美国产日韩xxxxx| 日韩亚洲欧美综合| 久久国产精品久久久| 在线欧美不卡| 欧美激情国产精品| 欧美电影打屁股sp| 99国产精品国产精品久久| 亚洲高清自拍| 欧美日韩成人精品| 午夜精品久久久| 欧美在线影院在线视频| 在线成人免费观看| 91久久精品美女| 欧美午夜片欧美片在线观看| 香蕉成人伊视频在线观看| 欧美一区二区高清在线观看| 合欧美一区二区三区| 欧美成人精品在线观看| 欧美电影在线| 亚洲欧美日本国产有色| 久久国产手机看片| 亚洲另类黄色| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产美女在线精品免费观看| 美女视频黄 久久| 欧美日韩不卡在线| 久久久久久久久久看片| 欧美ed2k| 久久成人资源| 欧美人与禽猛交乱配| 久久er99精品| 欧美精品免费视频| 久久久久久久尹人综合网亚洲| 免费在线国产精品| 午夜亚洲一区| 欧美精品系列| 毛片一区二区三区| 欧美日韩大片一区二区三区| 久久综合亚州| 国产欧美一区二区三区久久 | 午夜精品久久久久久久99樱桃| 亚洲国产精品电影| 午夜精品久久久久| 一区二区三区精品视频| 久久伊伊香蕉| 久久久久久亚洲精品杨幂换脸| 欧美美女bb生活片| 欧美成人中文| 国产一区日韩欧美| 亚洲天堂网站在线观看视频| 亚洲精品国产精品国自产观看 | 欧美视频精品在线观看| 牛人盗摄一区二区三区视频| 国产精品人人爽人人做我的可爱 | 99天天综合性| 久久伊人精品天天| 久久米奇亚洲| 国产真实久久| 亚洲欧洲av一区二区| 亚洲少妇自拍| 麻豆精品在线视频| 午夜精品一区二区三区电影天堂| 亚洲理论电影网| 久久尤物视频| 欧美 日韩 国产 一区| 国产日韩1区| 亚洲一区亚洲| 午夜精品视频在线| 国产精品亚洲片夜色在线| 一本久久a久久免费精品不卡| 最新日韩在线视频| 女同性一区二区三区人了人一| 两个人的视频www国产精品| 国产亚洲精品一区二区| 亚洲欧美文学| 久久免费偷拍视频| 在线不卡中文字幕| 狂野欧美一区| 亚洲国产高清aⅴ视频| 亚洲国产欧美日韩精品| 免费在线欧美视频| 亚洲精选大片| 亚洲自拍另类| 国产一区二区三区免费不卡| 欧美与欧洲交xxxx免费观看| 久久综合伊人77777蜜臀| 亚洲国产高清在线| 欧美精品在线免费播放| 一本色道久久综合精品竹菊 | 狠狠色香婷婷久久亚洲精品| 久久久久国产精品一区| 欧美激情视频一区二区三区免费| 亚洲精品一二三| 国产精品日韩欧美大师| 久久国产精品久久国产精品| 亚洲第一久久影院| 亚洲网在线观看| 国产视频亚洲精品| 欧美第一黄色网| 亚洲一区二区三区在线| 欧美成人综合| 亚洲综合久久久久| 一区二区三区在线视频免费观看| 美女999久久久精品视频| 99pao成人国产永久免费视频| 欧美一区二区三区另类| 亚洲人成在线免费观看| 亚洲调教视频在线观看| 久久一日本道色综合久久| 亚洲免费成人| 国产农村妇女精品一二区| 免费成人黄色| 午夜精品在线| 日韩系列欧美系列| 麻豆精品在线视频| 亚洲小说区图片区| 在线观看日韩av先锋影音电影院| 欧美精品aa| 久久成人免费| 亚洲视频精品| 亚洲欧洲偷拍精品| 久久久久久穴| 亚洲综合久久久久| 亚洲激情不卡| 国产综合亚洲精品一区二| 欧美日韩国产综合视频在线观看中文 | 国产欧美一级| 久久精品综合一区| 一本大道久久a久久综合婷婷| 久久国产精品久久精品国产| 日韩视频精品在线观看| 一区二区视频欧美| 国产欧美日韩在线播放| 欧美日韩国产在线播放| 久久这里有精品15一区二区三区| 亚洲视频一二三| 亚洲看片免费|