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

那誰的技術(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>
            欧美看片网站| 欧美高清视频一区二区| 亚洲精品在线观看视频| 欧美电影在线免费观看网站| 99精品国产热久久91蜜凸| 亚洲国产第一| 噜噜爱69成人精品| 99av国产精品欲麻豆| 一区二区激情视频| 国产日韩欧美综合精品| 久久亚洲欧美| 欧美精品久久久久久久免费观看 | 午夜精品免费在线| 欧美日韩少妇| 欧美人与性动交a欧美精品| 亚洲一区影院| 久久婷婷国产综合尤物精品| 91久久国产综合久久| 一区二区三区四区五区在线| 含羞草久久爱69一区| 亚洲精品护士| 国产一区二区日韩| 亚洲欧洲在线看| 国内精品伊人久久久久av影院 | 国产精品99久久久久久www| 国产亚洲精品bv在线观看| 欧美激情国产精品| 国产精品日韩二区| 亚洲国产精品第一区二区| 国产精品一区视频| 亚洲日本欧美在线| 国产在线观看一区| 亚洲午夜在线| 99国产精品99久久久久久粉嫩 | 亚洲色诱最新| 亚洲精品免费电影| 欧美一区高清| 亚洲自拍偷拍福利| 欧美精品国产一区| 蜜臀久久99精品久久久画质超高清| 欧美日韩99| 亚洲电影自拍| 伊人久久成人| 国产欧美一区二区三区在线老狼| 欧美日韩视频在线| 欧美在线视频一区| 欧美日韩网站| 91久久在线视频| 在线欧美不卡| 久久久久久国产精品mv| 久久国产手机看片| 国产精品三级视频| 亚洲午夜羞羞片| 亚洲一区二区精品在线观看| 欧美激情成人在线| 欧美激情视频一区二区三区免费 | 亚洲第一中文字幕在线观看| 狠狠88综合久久久久综合网| 午夜免费电影一区在线观看| 亚洲午夜视频在线| 欧美三区在线视频| aⅴ色国产欧美| 亚洲无人区一区| 欧美视频一区二区在线观看 | 亚洲国产精品一区二区久| 影音先锋另类| 另类综合日韩欧美亚洲| 欧美大胆a视频| 亚洲精品一品区二品区三品区| 久久这里只有| 亚洲精品1区2区| 宅男噜噜噜66一区二区| 亚洲专区欧美专区| 先锋资源久久| 老司机免费视频一区二区| 在线日韩欧美视频| 欧美精品在线观看| 9久re热视频在线精品| 欧美在线免费| 在线观看亚洲a| 欧美美女操人视频| 亚洲字幕在线观看| 麻豆免费精品视频| 日韩亚洲欧美精品| 国产精品一区一区三区| 久久精品国产亚洲一区二区三区| 欧美成人四级电影| 亚洲午夜精品久久| 黄色一区三区| 欧美日韩一区二区高清| 午夜在线视频一区二区区别| 欧美成人资源网| 亚洲一区二区少妇| 1769国产精品| 国产精品色网| 牛牛影视久久网| 亚洲性色视频| 欧美成人自拍视频| 香蕉av777xxx色综合一区| 亚洲福利av| 国产精品嫩草影院一区二区| 猫咪成人在线观看| 亚洲男女毛片无遮挡| 亚洲国产1区| 久久精品99无色码中文字幕| 亚洲三级影院| 国产综合香蕉五月婷在线| 欧美日韩国产综合视频在线观看中文| 欧美大香线蕉线伊人久久国产精品| 亚洲欧美在线网| 国产区精品视频| 欧美大片在线观看一区| 亚洲男人影院| 亚洲精选一区| 亚洲高清在线| 久久综合导航| 欧美制服丝袜| 亚洲一区美女视频在线观看免费| 亚洲国产另类久久久精品极度| 国产伦精品一区二区三区高清版| 欧美精品v日韩精品v国产精品| 久久频这里精品99香蕉| 午夜精品久久久久久| 在线亚洲一区观看| 亚洲精选大片| 亚洲经典三级| 亚洲国产婷婷香蕉久久久久久| 久热精品视频在线免费观看| 久久国产精品免费一区| 亚洲欧美高清| 亚洲自拍偷拍视频| 国产精品99久久久久久人| 亚洲日本成人| 亚洲国产小视频在线观看| 一色屋精品视频在线观看网站| 国产欧美在线视频| 国产美女精品视频| 国产日产欧美精品| 国产欧美一区二区三区在线看蜜臀| 国产精品爱啪在线线免费观看| 欧美精品久久久久久久| 欧美精品一区二| 欧美日本亚洲| 欧美日韩一区二区在线| 欧美日韩一区综合| 欧美日在线观看| 欧美视频在线观看免费| 国产精品久久久久久影视| 欧美午夜激情视频| 国产精品香蕉在线观看| 国产色婷婷国产综合在线理论片a| 国产精品夜色7777狼人| 欧美韩国日本综合| 在线观看91久久久久久| 亚洲国产日韩美| 亚洲精品日韩一| 亚洲视频www| 久久都是精品| 蜜臀a∨国产成人精品| 亚洲国产精品视频一区| 日韩亚洲欧美一区| 亚洲综合色噜噜狠狠| 久久www成人_看片免费不卡| 久久免费国产| 欧美激情小视频| 国产精品久久久久久久午夜| 国产一区亚洲| 亚洲精品在线三区| 亚洲免费视频一区二区| 久久免费视频网| 亚洲国产视频直播| 亚洲一区二区精品在线| 久久久国产一区二区| 欧美精品一区二| 国产目拍亚洲精品99久久精品 | 国产日韩欧美成人| 亚洲狠狠丁香婷婷综合久久久| 国产精品99久久久久久有的能看| 欧美一区综合| 亚洲激情欧美激情| 亚洲欧美日韩系列| 欧美电影资源| 国产一区二区三区日韩欧美| 亚洲精品久久久久久一区二区| 亚洲欧美综合v| 牛牛影视久久网| 欧美大片va欧美在线播放| 麻豆国产精品一区二区三区 | 亚洲美女av电影| 久久福利视频导航| 正在播放日韩| 一区二区自拍| 亚洲欧美在线看| 亚洲黄色免费电影| 久久精品国产第一区二区三区最新章节 | 亚洲韩日在线| 99精品热视频| 麻豆亚洲精品| 影音先锋日韩资源| 久久久久国产免费免费|