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

那誰的技術(shù)博客

感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評(píng)論 - 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ù)的指針,之所以要對(duì)同樣可以表示為是void*的指針分三個(gè)類型的typedef,目的是為了在代碼中一目了然,看到類型的名字就能知道是作什么用的了。

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

原本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*,而對(duì)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,對(duì)于tTmp而言,它的類型是base_t也即是char*,sizeof(char) = 1,因此采用char*來保存以及進(jìn)行指針的加減操作是最自然的操作,只要我們知道需要前進(jìn)的步數(shù)(n),每部的幅度(nValSize),就可以通過把指針強(qiáng)制轉(zhuǎn)化為base_t也就是char*來達(dá)到我們所要到達(dá)的位置。

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

posted on 2007-05-02 00:59 那誰 閱讀(807) 評(píng)論(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>
            久久国产66| 亚洲欧洲精品一区二区三区不卡| 亚洲精品欧洲精品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美黄色免费| 欧美日韩xxxxx| 国产精品高精视频免费| 国产欧美另类| 在线精品国产成人综合| 亚洲裸体在线观看| 亚洲欧美日韩国产综合| 久久精品综合一区| 亚洲国产1区| 亚洲国产专区| 亚洲综合国产精品| 久久久国产视频91| 99热这里只有成人精品国产| 亚洲美女性视频| 午夜久久一区| 亚洲国产精品999| 亚洲视频在线观看网站| 久久视频国产精品免费视频在线| 欧美大片免费观看| 欧美一区二区成人| 欧美波霸影院| 国产亚洲欧美日韩日本| 国产精品电影网站| 狠狠色狠色综合曰曰| 一区二区三区欧美成人| 久久一区视频| 亚洲一区影音先锋| av不卡在线| 久久亚洲影音av资源网| 国产精品免费一区二区三区观看| 在线观看国产精品淫| 亚洲一区二区三区在线| 欧美成人有码| 新67194成人永久网站| 欧美精品激情| 91久久在线播放| 久久只有精品| 久久久国产精品亚洲一区| 国产精品99久久久久久久女警| 久久亚洲精品伦理| 国产精品99久久久久久久久| 欧美88av| 1024欧美极品| 美女网站久久| 久久久久.com| 一区二区三区在线视频免费观看| 午夜在线视频观看日韩17c| 亚洲免费观看在线观看| 欧美国产精品va在线观看| **网站欧美大片在线观看| 久久影视三级福利片| 久久av一区| 免费成人高清| 亚洲国产精品一区在线观看不卡| 久久深夜福利免费观看| 欧美中在线观看| 激情欧美一区二区三区| 麻豆av一区二区三区久久| 午夜欧美大尺度福利影院在线看| 国产精品v欧美精品v日韩 | 亚洲国产免费| 免费看成人av| 亚洲乱码精品一二三四区日韩在线 | 亚洲电影免费在线观看| 欧美高清在线一区| 欧美阿v一级看视频| 9色精品在线| 亚洲小视频在线观看| 国产精品夜夜嗨| 久久手机免费观看| 欧美不卡视频| 亚洲免费在线视频一区 二区| 日韩一二在线观看| 国产欧美精品一区aⅴ影院| 久久视频在线看| 欧美韩日精品| 亚洲欧美成人| 久久精品免费播放| 亚洲精品久久7777| 中文日韩电影网站| 一区视频在线看| 亚洲免费成人av| 国产欧美一区二区三区视频| 久久午夜激情| 欧美日韩亚洲综合一区| 欧美资源在线| 欧美国产精品v| 久久狠狠一本精品综合网| 久久性天堂网| 欧美一区二区视频97| 欧美77777| 久久国产乱子精品免费女| 欧美jizzhd精品欧美喷水| 亚洲婷婷综合久久一本伊一区| 欧美国产日本| 136国产福利精品导航网址| 亚洲精品麻豆| 精品盗摄一区二区三区| 99re成人精品视频| 亚洲电影免费观看高清完整版在线 | 亚洲毛片视频| 香蕉视频成人在线观看| 99精品99久久久久久宅男| 亚洲欧美在线另类| 日韩视频―中文字幕| 欧美在线你懂的| 亚洲一区二区三区欧美| 欧美a一区二区| 久久麻豆一区二区| 国产日韩欧美亚洲一区| 亚洲片在线观看| 亚洲国产成人精品女人久久久| 亚洲欧美激情视频在线观看一区二区三区| 亚洲高清在线播放| 欧美一区二区三区四区在线观看| 一区二区三区日韩精品| 欧美高清在线播放| 免费在线观看成人av| 国产日韩欧美日韩| 午夜视频一区在线观看| 性欧美8khd高清极品| 欧美日韩国产bt| 亚洲乱码日产精品bd| 亚洲精品一区二区三区在线观看| 久久女同互慰一区二区三区| 久久久国产精品亚洲一区| 国产午夜亚洲精品羞羞网站| 亚洲欧美日韩一区二区三区在线观看| 亚洲图片欧洲图片av| 国产精品高潮呻吟视频| 亚洲一区二区成人| 欧美一区二区三区免费视| 国产欧美精品日韩| 久久精品国产免费看久久精品| 久久久久一区二区三区四区| 国产一区自拍视频| 久久久久综合网| 亚洲电影免费在线| 一区二区av在线| 国产精品久久久久久模特| 亚洲午夜精品网| 久久精品99国产精品日本| 伊人久久亚洲影院| 欧美xx69| 亚洲网站在线| 久久精品国产综合| 激情五月婷婷综合| 欧美大香线蕉线伊人久久国产精品| 亚洲人精品午夜| 亚洲在线免费观看| 国外成人网址| 欧美经典一区二区| 一区二区三区国产精华| 欧美亚洲免费在线| 亚洲电影成人| 国产精品国产三级国产aⅴ浪潮 | 亚洲精品影视在线观看| 久久久久久久久久看片| 最新日韩中文字幕| 亚洲另类黄色| 国产精品久久激情| 久久国产精品亚洲va麻豆| 欧美xx69| 亚洲小视频在线观看| 国产日韩欧美不卡| 欧美激情视频一区二区三区不卡| 亚洲午夜高清视频| 欧美国产免费| 欧美一级淫片播放口| 精品999久久久| 欧美精品少妇一区二区三区| 亚洲欧美日韩国产成人精品影院| 美女脱光内衣内裤视频久久影院 | 亚洲第一色中文字幕| 亚洲男女自偷自拍| 亚洲人成在线观看| 国产区在线观看成人精品| 欧美精彩视频一区二区三区| 欧美在线免费一级片| 99热免费精品| 欧美黄色aaaa| 久久久www成人免费无遮挡大片| 亚洲精品自在在线观看| 国内成+人亚洲| 国产精品日本精品| 欧美日本高清视频| 久久亚洲精选| 欧美一区二区三区四区在线观看| 夜夜狂射影院欧美极品| 亚洲国产一区二区a毛片| 老鸭窝毛片一区二区三区| 欧美一区二区大片| 亚洲欧美视频一区| 亚洲综合视频1区| 亚洲一区二区三区四区五区黄| 亚洲一本视频|