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

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數據加載中……

CGL開發手記之二--CGL中的數據類型

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

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

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

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

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

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

再來說說其他的兩個typedef:
typedef char* base_t;
typedef char  bool_t;
最后的一個bool_t很好理解,就是一般的bool型嘛,之所以用char很簡單,char類型所需要的字節數最少,省空間。而base_t這個類型的含義是一個系統中最基本的數據類型,或者可以這么理解,別的數據類型所占有的字節數都可以表示為這個類型的算術操作,以上的言語也許晦澀了一些,我用例子來說明。
看CGL中一個函數的實現:
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;
}
這個函數的作用是把迭代器pIter中保存的指向容器中數據的指針tPoint向前移動n個位置,大家知道指針的移動和它所指向的數據類型的大小有密切的關系,換句話說一個指針向前走n個位置所要移動的字節數為n * 它所指向的數據的尺寸,在上面的函數中,tPoint這個指針所指向的數據的尺寸存放在pIter的成員變量nValSize中,你也許會問直接使用sizeof(*tPoint)不就可以得到這個數值了么?別忘了我們前面說過所有的指針類型都是void*,而對void*指針是不能進行解引用操作的,所以我們需要一個變量來存放數據的尺寸。
注意到函數中的兩個操作:
 tTmp = (base_t)(pIter->tPoint);
 pIter->tPoint = tTmp + pIter->nValSize * n;
結合著base_t的定義,可以解釋為把void*指針tPoint強制轉化為char*,而tPoint向前走的位置為tTmp +  nValSize*n,對于tTmp而言,它的類型是base_t也即是char*,sizeof(char) = 1,因此采用char*來保存以及進行指針的加減操作是最自然的操作,只要我們知道需要前進的步數(n),每部的幅度(nValSize),就可以通過把指針強制轉化為base_t也就是char*來達到我們所要到達的位置。

以上,是我對目前CGL中幾個typedef的解釋??梢钥吹降氖?,設計中總是存在著這樣那樣的折中,很多地方的處理也是不完美的,我選擇的是不向宏妥協而是自己對指針進行處理和操作。

posted on 2007-05-02 00:59 那誰 閱讀(814) 評論(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观看| 日韩一区二区久久| 欧美电影电视剧在线观看| 欧美黄色免费网站| 亚洲日本乱码在线观看| 女仆av观看一区| 亚洲国产天堂网精品网站| 亚洲国产精品专区久久| 美女精品自拍一二三四| 亚洲高清资源综合久久精品| 亚洲日本成人在线观看| 欧美激情视频网站| 亚洲精品国精品久久99热| 99精品久久久| 国产精品扒开腿做爽爽爽软件| 99精品久久免费看蜜臀剧情介绍| 在线亚洲欧美| 国产精品你懂的在线| 国产女精品视频网站免费| 亚洲欧洲精品成人久久奇米网| 亚洲国产日韩欧美一区二区三区| 久久久久国产精品一区二区| 美女啪啪无遮挡免费久久网站| 好吊日精品视频| 久久欧美中文字幕| 亚洲国产精品美女| 亚洲午夜一区二区三区| 国产免费成人在线视频| 久久九九99视频| 亚洲人成久久| 欧美一区二区三区男人的天堂| 国产日韩一区二区三区| 久久一二三区| 一区二区欧美在线观看| 久久精品一区二区国产| 亚洲精品久久7777| 国产精品日韩精品欧美精品| 久久国产欧美日韩精品| 亚洲激情成人| 性欧美xxxx大乳国产app| 精久久久久久| 国产精品播放| 久久影院午夜论| 亚洲视频久久| 亚洲二区免费| 欧美中文字幕视频| 99v久久综合狠狠综合久久| 国产精品一级二级三级| 欧美1区免费| 欧美一区二区免费观在线| 亚洲国产另类 国产精品国产免费| 午夜精品久久久久久99热软件| 136国产福利精品导航| 欧美视频一区在线| 老司机亚洲精品| 午夜精品国产更新| 亚洲精品视频啊美女在线直播| 久久久精品一品道一区| 亚洲视频香蕉人妖| 亚洲激情社区| 国产综合18久久久久久| 欧美日韩伦理在线| 美女视频黄a大片欧美| 午夜精品影院在线观看| aaa亚洲精品一二三区| 欧美成人午夜激情| 久久综合电影一区| 香蕉久久久久久久av网站| 日韩亚洲欧美一区二区三区| 尤物精品国产第一福利三区| 国产精品一区二区久久久| 欧美日韩成人在线视频| 国产精品ⅴa在线观看h| 日韩亚洲一区二区| 欧美韩国在线| 久久这里只有| 欧美与欧洲交xxxx免费观看 | 欧美日韩在线电影| 久久香蕉精品| 久久久久久久久岛国免费| 欧美一级午夜免费电影| 亚洲综合不卡| 亚洲欧美www| 亚洲男人的天堂在线aⅴ视频| 亚洲伦理自拍| 99精品视频网| 制服丝袜亚洲播放| 一本色道久久综合亚洲精品按摩 | 一区二区三区 在线观看视| 欧美福利在线| 亚洲高清电影| 亚洲国产精品成人| 亚洲激情自拍| 日韩一区二区高清| 亚洲毛片在线免费观看| 亚洲乱码国产乱码精品精天堂| 亚洲精品久久久蜜桃| 亚洲精品一区二区三区不| 亚洲精品社区| 亚洲一区国产视频| 性欧美1819sex性高清| 久久精品99国产精品日本| 久久视频国产精品免费视频在线| 久久久亚洲影院你懂的| 欧美成黄导航| 欧美日韩一区二区国产| 国产精品视频精品视频| 国产一区香蕉久久| 亚洲国产色一区| 在线亚洲自拍| 久久久91精品国产一区二区三区| 麻豆国产精品一区二区三区| 欧美国产精品一区| 亚洲美女黄色片| 午夜精品久久久久久99热软件 | 性久久久久久| 久久夜色精品国产噜噜av| 欧美精品一区三区在线观看| 国产精品久久久久久户外露出| 国产在线国偷精品产拍免费yy| 亚洲韩日在线| 亚洲欧美在线x视频| 快she精品国产999| 日韩视频二区| 欧美在线观看你懂的| 欧美诱惑福利视频| 美女亚洲精品| 一本色道久久综合亚洲二区三区| 欧美一区二区三区的| 欧美成人中文| 国产亚洲欧洲997久久综合| 在线不卡亚洲| 亚洲欧美一区二区视频| 免费国产自线拍一欧美视频| 夜夜嗨av一区二区三区免费区| 久久精品国产69国产精品亚洲| 欧美激情一区二区三区成人| 国产欧美一区二区三区国产幕精品| 亚洲电影在线看| 欧美一区二区三区在| 免费在线亚洲| 午夜精品成人在线| 欧美久久久久免费| 在线电影一区| 久久精品国产免费观看| 亚洲人成在线观看一区二区| 欧美一区二区三区四区视频| 欧美久久电影| 91久久精品网| 老司机67194精品线观看| 欧美成人精品高清在线播放| 国产麻豆精品在线观看| 99精品国产热久久91蜜凸| 快she精品国产999| 亚洲欧美另类在线| 欧美视频一区| 99国产精品99久久久久久| 欧美xart系列高清| 欧美在线视频在线播放完整版免费观看 | 久久精品中文字幕一区| 一本色道久久综合亚洲精品婷婷| 欧美不卡三区| 亚洲国产一区在线| 久久亚洲春色中文字幕| 亚洲一区二区三区四区五区黄| 欧美久色视频| 亚洲精品欧洲精品| 亚洲高清不卡在线| 美女图片一区二区| 亚洲国产高清一区二区三区| 麻豆精品视频在线观看| 久久激情综合网| 在线观看日韩| 欧美成人精品不卡视频在线观看 | 欧美黑人在线播放| 曰本成人黄色| 老司机凹凸av亚洲导航| 欧美在线观看一区| 国产亚洲午夜| 久久综合九色九九| 久久久久久久97| 亚洲激情在线| 亚洲国产专区校园欧美| 欧美劲爆第一页| 亚洲影院色无极综合| 亚洲欧美日韩成人| 国产专区综合网| 欧美激情四色 |