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

那誰的技術(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>
            欧美日韩的一区二区| 久久嫩草精品久久久精品| 牛牛影视久久网| 亚洲高清一区二| 亚洲激情不卡| 国产精品爱久久久久久久| 亚洲女性喷水在线观看一区| 亚洲自拍偷拍网址| 国产在线视频欧美| 亚洲黄色影片| 欧美私人啪啪vps| 久久久一区二区三区| 欧美高清视频在线播放| 亚洲欧美精品中文字幕在线| 午夜精品一区二区三区四区| 亚洲第一色在线| 亚洲伦理自拍| 激情综合自拍| 亚洲最黄网站| 激情一区二区| 亚洲一区二区免费视频| 在线观看欧美激情| 亚洲色诱最新| 亚洲欧洲在线看| 亚洲欧美日韩人成在线播放| 亚洲国产日韩欧美在线动漫| 一区二区三区欧美成人| 伊伊综合在线| 亚洲一区二区三区777| 亚洲黄色在线观看| 亚洲欧美一区二区原创| 亚洲精品亚洲人成人网| 欧美一站二站| 亚洲一区国产| 欧美成人免费在线视频| 久久激情中文| 欧美午夜免费| 亚洲国产日韩欧美| 国内精品美女在线观看| 亚洲男人第一av网站| 99在线精品免费视频九九视| 久久手机免费观看| 久久激情综合| 国产欧美日本| 亚洲网在线观看| 中国亚洲黄色| 欧美日本精品| 亚洲精品在线观| 91久久精品美女高潮| 久久久久国产免费免费| 久久精品在线| 国产日韩欧美高清免费| 亚洲新中文字幕| 亚洲一区二区在线视频| 欧美视频免费在线| 99精品热视频| 亚洲免费在线观看视频| 欧美日韩国产小视频在线观看| 亚洲福利视频免费观看| 亚洲国产第一页| 久久久久久伊人| 韩国av一区二区三区四区| 新片速递亚洲合集欧美合集| 先锋影音国产精品| 国产日韩欧美精品在线| 欧美一区二区在线| 久久综合综合久久综合| 一区二区三区在线高清| 老牛嫩草一区二区三区日本| 欧美1区3d| 亚洲精品在线免费| 欧美日韩国产精品自在自线| 日韩天堂av| 性欧美videos另类喷潮| 国产自产高清不卡| 欧美成人乱码一区二区三区| 亚洲欧洲另类国产综合| 亚洲一区二区在线看| 国产伦精品一区二区三区高清版| 午夜在线a亚洲v天堂网2018| 久久久久免费| 99xxxx成人网| 国产精品麻豆成人av电影艾秋| 亚洲午夜电影网| 久久综合九色| 一区二区三区av| 国产日韩欧美精品一区| 巨乳诱惑日韩免费av| av成人天堂| 久久在精品线影院精品国产| 日韩一级成人av| 国产一区二区三区高清| 欧美h视频在线| 亚洲午夜高清视频| 欧美aⅴ99久久黑人专区| 中文成人激情娱乐网| 国产欧美日韩亚洲精品| 巨胸喷奶水www久久久免费动漫| 亚洲精品免费网站| 久久久久久97三级| 亚洲视频在线观看视频| 伊人精品成人久久综合软件| 欧美日在线观看| 久久综合九色综合欧美狠狠| 在线视频日韩精品| 亚洲国产成人一区| 久久久久91| 亚洲一区日韩| 亚洲激情网站| 黄色成人91| 国产精品免费在线| 欧美精品网站| 久久九九热免费视频| 中日韩美女免费视频网址在线观看| 久久免费视频这里只有精品| 午夜视频在线观看一区二区三区 | 久久免费精品日本久久中文字幕| 亚洲精品视频一区二区三区| 蜜桃av一区| 久久精品伊人| 欧美一区二区在线播放| 亚洲深夜影院| 99re6热在线精品视频播放速度 | 国产精品综合| 欧美视频免费在线观看| 欧美成人精品一区二区| 久久久无码精品亚洲日韩按摩| 亚洲免费在线看| 亚洲自拍偷拍视频| 亚洲淫片在线视频| 亚洲午夜激情网页| 欧美综合第一页| 亚洲综合电影| 亚洲一区二区三区涩| 日韩一级二级三级| 一本色道久久综合亚洲精品按摩 | 亚洲一级二级在线| 一区二区免费在线视频| 99亚洲视频| 一区二区三区欧美在线| 一区二区三区视频免费在线观看| 亚洲免费成人| 亚洲美女在线看| 日韩亚洲精品电影| 国产精品99久久久久久久久| 亚洲婷婷综合久久一本伊一区| 亚洲天堂av在线免费观看| 亚洲婷婷在线| 欧美在线free| 久久这里有精品视频| 欧美粗暴jizz性欧美20| 欧美高清在线精品一区| 最新精品在线| 夜夜爽www精品| 亚洲欧美在线磁力| 久久久久久亚洲精品杨幂换脸| 老司机精品导航| 欧美激情第五页| 国产精品国产a级| 国产亚洲视频在线| 亚洲激情不卡| 亚洲欧美春色| 久久综合色影院| 亚洲精品一区在线观看| 亚洲欧美国产一区二区三区| 久久精品日韩一区二区三区| 欧美电影在线播放| 国产精品女人网站| 在线看片第一页欧美| 一区二区三区你懂的| 久久精品中文| 亚洲精品三级| 久久久久成人精品免费播放动漫| 欧美成人a视频| 国产乱码精品一区二区三| 亚洲高清不卡| 欧美一级黄色录像| 亚洲福利视频网| 性刺激综合网| 欧美日韩精品在线视频| 国产一区二区三区的电影 | 国产欧美视频一区二区三区| 亚洲欧洲日韩女同| 欧美制服丝袜| 亚洲精品综合| 猛干欧美女孩| 国产一区二区久久久| 亚洲午夜久久久久久尤物| 久久婷婷国产麻豆91天堂| 在线综合视频| 欧美好骚综合网| 永久域名在线精品| 久久av一区二区| 9l视频自拍蝌蚪9l视频成人| 美日韩精品免费| 国模私拍视频一区| 久久不射网站| 中日韩美女免费视频网站在线观看| 美女福利精品视频| 曰本成人黄色|