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

那誰的技術(shù)博客

感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

CGL開發(fā)手記之二--CGL中的數(shù)據(jù)類型

為了做到能操作所有類型的數(shù)據(jù),我參看了幾個(gè)類似的C語言的庫,基本上就是兩種做法:一是使用宏,二是使用void*指針。最后我選擇了后者,原因很簡單,我不是一個(gè)很推崇在代碼中大量使用宏的人,一方面覺得這樣作會(huì)讓代碼的可讀性降低,另一方面我也確實(shí)不是寫宏的高手。

在CGL中,有以下的幾個(gè)typedef都把void*定義為某種類型:
typedef void* container_t;
typedef void* point_t;
typedef void* data_t;

分別作一個(gè)解釋,container_t表示的是指向容器的指針,point_t表示的是通用指向某容器的指針,不論是指向數(shù)組成員的指針還是一個(gè)鏈表結(jié)點(diǎn)的指針都可以"泛化"的表示為"pos_t",而data_t表示的是存放數(shù)據(jù)的指針,之所以要對同樣可以表示為是void*的指針分三個(gè)類型的typedef,目的是為了在代碼中一目了然,看到類型的名字就能知道是作什么用的了。

container_t的含義很好理解,現(xiàn)在對后面兩種類型作一下解釋。

原本pos_t不叫pos_t的,而是被定義為iter_t,因?yàn)樵赟TL中迭代器其實(shí)就是一個(gè)行為很像指針的東東,可以解引用,可以遞增指向下一個(gè)元素,遞減指向前一個(gè)元素,等等。但是需要注意的時(shí)候,由于C++中可以重載操作符,如*,++,--這樣的操作符都可以被重載以至于一個(gè)iterator的行為看上去和一個(gè)普通的指針沒有什么區(qū)別。但是在CGL中,是完全采用的C語言實(shí)現(xiàn)的,沒有辦法做到重載這些操作符,所以我專門提供了一個(gè)叫做iteraotr_t的結(jié)構(gòu)體,里面有函數(shù)指針成員可以實(shí)現(xiàn)以上這些重載操作符所需要作的事情(后面會(huì)有專門的一節(jié)來講述這個(gè)結(jié)構(gòu)體以及CGL中迭代器的設(shè)計(jì)),所以如果有一個(gè)類型為iter_t一個(gè)類型為iterator_t會(huì)不會(huì)讓人混淆呢?至少我偶爾回頭看我的代碼的時(shí)候是會(huì)弄混的,因此我決定把iter_t更名為pos_t也就是位置的意思。

data_t用于保存存放數(shù)據(jù)的指針,這里有幾個(gè)問題需要交待一下。首先是這樣作的弊端,雖然這樣避免前面提到的大量使用宏的缺點(diǎn),但是卻浪費(fèi)了存儲(chǔ)的空間以及會(huì)帶來一些使用上的不方便。先說浪費(fèi)了存儲(chǔ)空間,以往存放一個(gè)數(shù)據(jù)只需要一個(gè)與該數(shù)據(jù)相同大小的空間就可以了,但是現(xiàn)在還需要多使用一個(gè)data_t指針指向分配好的空間,無形之中浪費(fèi)了一個(gè)指針的空間。再說使用的不方便,以往處理數(shù)據(jù)的時(shí)候如果沒有特別的要求可以直接傳值,而現(xiàn)在必須傳指針,因?yàn)镃GL的函數(shù)不認(rèn)什么int,double,char類型,只處理指針。換句話說,假如f是CGL中的一個(gè)函數(shù),如果要調(diào)用傳入一個(gè)整型參數(shù)5,你必須這樣作:
int nVal = 5;
f(&nVal);
而一般傳值就可以做到的調(diào)用是f(5)就可以了,這樣會(huì)造成使用上的不方便。
至于數(shù)據(jù)的賦值,我采用的C庫中memcpy函數(shù),只要傳入指向數(shù)據(jù)的指針和數(shù)據(jù)的尺寸就可以,比較數(shù)據(jù)是否相等則采用C庫中的memcmp函數(shù),所需要知道的參數(shù)和memcpy一樣,而當(dāng)需要比較數(shù)據(jù)的大小時(shí),這個(gè)比較頭疼,因?yàn)镃庫中沒有根據(jù)指針和數(shù)據(jù)的大小進(jìn)行比較的函數(shù),我在后面會(huì)解釋我現(xiàn)在處理此類問題的辦法。

再來說說其他的兩個(gè)typedef:
typedef char* base_t;
typedef char  bool_t;
最后的一個(gè)bool_t很好理解,就是一般的bool型嘛,之所以用char很簡單,char類型所需要的字節(jié)數(shù)最少,省空間。而base_t這個(gè)類型的含義是一個(gè)系統(tǒng)中最基本的數(shù)據(jù)類型,或者可以這么理解,別的數(shù)據(jù)類型所占有的字節(jié)數(shù)都可以表示為這個(gè)類型的算術(shù)操作,以上的言語也許晦澀了一些,我用例子來說明。
看CGL中一個(gè)函數(shù)的實(shí)現(xiàn):
static point_t cgls_iter_advance(piterator_t pIter, size_t n)
{
    base_t tTmp;

    CGL_ASSERT(
NULL != pIter);
    CGL_ASSERT(
0 <= n);

    tTmp 
= (base_t)(pIter->tPoint);
    pIter
->tPoint = tTmp + pIter->nValSize * n;
    return pIter
->tPoint;
}
這個(gè)函數(shù)的作用是把迭代器pIter中保存的指向容器中數(shù)據(jù)的指針tPoint向前移動(dòng)n個(gè)位置,大家知道指針的移動(dòng)和它所指向的數(shù)據(jù)類型的大小有密切的關(guān)系,換句話說一個(gè)指針向前走n個(gè)位置所要移動(dòng)的字節(jié)數(shù)為n * 它所指向的數(shù)據(jù)的尺寸,在上面的函數(shù)中,tPoint這個(gè)指針?biāo)赶虻臄?shù)據(jù)的尺寸存放在pIter的成員變量nValSize中,你也許會(huì)問直接使用sizeof(*tPoint)不就可以得到這個(gè)數(shù)值了么?別忘了我們前面說過所有的指針類型都是void*,而對void*指針是不能進(jìn)行解引用操作的,所以我們需要一個(gè)變量來存放數(shù)據(jù)的尺寸。
注意到函數(shù)中的兩個(gè)操作:
 tTmp = (base_t)(pIter->tPoint);
 pIter->tPoint = tTmp + pIter->nValSize * n;
結(jié)合著base_t的定義,可以解釋為把void*指針tPoint強(qiáng)制轉(zhuǎn)化為char*,而tPoint向前走的位置為tTmp +  nValSize*n,對于tTmp而言,它的類型是base_t也即是char*,sizeof(char) = 1,因此采用char*來保存以及進(jìn)行指針的加減操作是最自然的操作,只要我們知道需要前進(jìn)的步數(shù)(n),每部的幅度(nValSize),就可以通過把指針強(qiáng)制轉(zhuǎn)化為base_t也就是char*來達(dá)到我們所要到達(dá)的位置。

以上,是我對目前CGL中幾個(gè)typedef的解釋。可以看到的是,設(shè)計(jì)中總是存在著這樣那樣的折中,很多地方的處理也是不完美的,我選擇的是不向宏妥協(xié)而是自己對指針進(jìn)行處理和操作。

posted on 2007-05-02 00:59 那誰 閱讀(808) 評論(0)  編輯 收藏 引用 所屬分類: CGL

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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二区| 欧美激情久久久久| 亚洲午夜高清视频| 1000部精品久久久久久久久| 在线看一区二区| 日韩午夜电影av| 性欧美xxxx视频在线观看| 免费av成人在线| 亚洲无亚洲人成网站77777| 欧美诱惑福利视频| 欧美日韩第一区| 影音先锋日韩资源| 午夜精品久久久久久久男人的天堂 | 欧美精品激情| 国产视频一区免费看| 日韩一级在线观看| 久久亚洲一区| 亚洲欧美日韩综合国产aⅴ| 欧美片在线播放| 亚洲第一视频网站| 久久久久久欧美| 亚洲欧美资源在线| 国产精品久久久久久久久久久久| 亚洲精品专区| 免费一级欧美片在线观看| 香蕉成人伊视频在线观看| 国产精品劲爆视频| 在线一区二区三区做爰视频网站 | 欧美日本免费一区二区三区| 狠狠操狠狠色综合网| 欧美伊人久久大香线蕉综合69| 最新日韩中文字幕| 久久午夜精品一区二区| 国产一区二区三区精品欧美日韩一区二区三区 | 一本大道久久a久久精品综合| 久久亚洲综合网| 国产午夜精品一区二区三区欧美| 亚洲视频一区二区免费在线观看| 最近中文字幕日韩精品| 毛片精品免费在线观看| 亚洲国产乱码最新视频| 久久综合中文字幕| 久久久久综合| 亚洲国产片色| 亚洲人成人77777线观看| 欧美精品播放| 国产精品99久久久久久久女警| 日韩视频永久免费观看| 亚洲大胆人体在线| 欧美91大片| 免播放器亚洲一区| 91久久亚洲| 日韩视频一区二区三区在线播放| 欧美精品在线一区二区三区| 99日韩精品| 亚洲特黄一级片| 国产色爱av资源综合区| 久久综合精品国产一区二区三区| 久久久久久国产精品mv| 91久久综合| 亚洲作爱视频| 国产午夜亚洲精品理论片色戒| 久久在线视频| 欧美激情视频一区二区三区在线播放 | 欧美成年人视频网站| 蜜臀a∨国产成人精品| 一本色道久久综合亚洲精品小说 | 久久久久欧美精品| 亚洲欧洲在线免费| 一本一本久久| 狠狠入ady亚洲精品经典电影| 欧美激情视频在线免费观看 欧美视频免费一| 免费亚洲婷婷| 欧美亚洲一区三区| 久久五月天婷婷| 亚洲欧美不卡| 麻豆精品传媒视频| 亚洲一区视频在线| 久久九九精品99国产精品| 一本大道久久a久久综合婷婷| 亚洲自拍偷拍一区| 在线观看av不卡| 亚洲视频在线观看视频| 亚洲激情影视| 欧美专区亚洲专区| 亚洲一区二区三区激情| 另类亚洲自拍| 久久精品国产第一区二区三区| 欧美不卡视频一区| 久久欧美中文字幕| 国产精品久久久久久av福利软件 | 国产欧美日韩精品专区| 欧美成人综合网站| 国产日韩欧美一区二区三区四区| 亚洲国产成人精品女人久久久 | 欧美一区国产二区| 欧美日韩国产成人在线91| 午夜亚洲性色福利视频| 欧美成人首页| 久久蜜桃av一区精品变态类天堂| 欧美日韩一区二区三区四区五区| 久久亚洲美女| 国产啪精品视频| 亚洲视频1区2区| 夜夜嗨av色一区二区不卡| 乱中年女人伦av一区二区| 久久久国产精彩视频美女艺术照福利| 欧美日韩综合视频| 欧美精品在线一区| 蜜乳av另类精品一区二区| 国产女主播一区二区三区| 这里只有精品视频在线| 夜夜精品视频一区二区| 欧美经典一区二区| 亚洲国产欧美日韩| 91久久精品国产91久久| 久久久免费精品视频| 久久久久久亚洲综合影院红桃| 国产精品久久久久国产精品日日| 99视频在线精品国自产拍免费观看| 亚洲三级免费观看| 欧美激情 亚洲a∨综合| 亚洲激情不卡| 亚洲视频你懂的| 国产精品wwwwww| 亚洲一区二区免费看| 欧美一区二区三区视频在线观看| 国产精品欧美日韩一区| 午夜精彩视频在线观看不卡 | 亚洲高清自拍| 美女主播一区| 亚洲国产日韩在线| 一区二区三区精品视频| 国产精品久久国产愉拍| 午夜老司机精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲第一中文字幕在线观看| 欧美aa在线视频| 一区二区三区欧美在线| 欧美在线看片| 亚洲黄色三级| 亚洲欧美日韩精品久久亚洲区| 欧美一级电影久久| 在线欧美日韩| 欧美日韩专区| 久久精品国产免费观看| 亚洲激情小视频| 亚洲欧美日韩国产精品| 国产亚洲永久域名| 欧美黄色免费网站| 午夜精品福利一区二区蜜股av| 免费成人黄色av| 亚洲图片在区色| 在线不卡视频| 国产精品v欧美精品v日韩| 久久精品国产99| 一本色道久久综合一区| 久久综合给合| 亚洲一级免费视频| 亚洲成人在线观看视频| 国产精品久久国产精品99gif| 久久男女视频| 一区二区三区高清在线 | 国产精品久久久久国产a级| 亚洲女同同性videoxma| 美女精品在线观看| 亚洲综合成人在线| 亚洲精品免费观看| 国产一区二区三区久久 | 一区二区三区波多野结衣在线观看| 午夜精品国产| 夜夜精品视频一区二区| 伊人激情综合| 国产乱肥老妇国产一区二| 欧美精品久久一区| 久久久www| 亚洲免费在线观看| 亚洲美女视频在线观看| 欧美激情成人在线视频| 麻豆精品一区二区av白丝在线| 亚洲欧美日韩综合aⅴ视频| 99re亚洲国产精品| 亚洲韩国日本中文字幕|