日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

对云风 cstring 第二次解析

發(fā)布時間:2023/11/27 生活经验 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对云风 cstring 第二次解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

????????

?

    從明天起?關(guān)心糧食和蔬菜

      我有一所房子?面朝大海?春暖花開

?

本文前提條件

  1.了解?posix?線程

  2.了解?原子操作

  3.具備簡單C基礎(chǔ),或者?你也敲一遍.

如果上面不太清楚,你可以翻看我以前的博客,或者'百度'搜索.

?

結(jié)論

  1.云風(fēng)前輩的?玩具?cstring?有點坑,?內(nèi)存管理很隨意(也可能時我菜,理解不了他飄逸的寫法)

  2.對于江湖中成名已久的?高手,?其實?勝在?思路上.

  3.前輩3-4h搞完的,重構(gòu)了1周,?發(fā)現(xiàn)?const?char*?和?char*?夠用了,真的,越簡單越針對 ,?越好,學(xué)習(xí)成本越低

對簡單開源代碼有興趣可以看看,畢竟開源的不都是好的.這里做的工作就是簡單和擴平臺,簡單可用升級,如果你也對C字符串感興趣

可以看看,否則沒有必要.

?

正文

  到這里扯皮結(jié)束了,?最近任務(wù)有點多,游戲公司加班太瘋狂了,做的越快任務(wù)越多.哎.?以前博客可能講了不少關(guān)于cstring?結(jié)構(gòu)設(shè)計.

這里就簡單扯一點,重構(gòu)部分.?從整體上講,細節(jié)自己多練習(xí)了.

?

1.跨平臺所做的工作

  跨平臺主要圍繞等待函數(shù)和原子操作封裝,看下面?的

sc_atom.h?文件內(nèi)容

#ifndef _SC_ATOM
#define _SC_ATOM/** 作者 : wz* * 描述 : 簡單的原子操作,目前只考慮 VS(CL) 小端機 和 gcc*         推薦用 posix 線程庫*/// 如果 是 VS 編譯器
#if defined(_MSC_VER)#include <Windows.h>//忽略 warning C4047: “==”:“void *”與“LONG”的間接級別不同
#pragma warning(disable:4047) // v 和 a 多 long 這樣數(shù)據(jù)
#define ATOM_FETCH_ADD(v, a) \InterlockedExchangeAdd((LONG*)&(v), (LONG)(a))#define ATOM_ADD_FETCH(v, a) \InterlockedAdd((LONG*)&(v), (LONG)(a))#define ATOM_SET(v, a) \InterlockedExchange((LONG*)&(v), (LONG)(a))#define ATOM_CMP(v, c, a) \(c == InterlockedCompareExchange((LONG*)&(v), (LONG)(a), (LONG)c))/*對于 InterlockedCompareExchange(v, c, a) 等價于下面long tmp = v ; v == a ? v = c : ; return tmp;咱么的 ATOM_FETCH_CMP(v, c, a) 等價于下面long tmp = v ; v == c ? v = a : ; return tmp;*/
#define ATOM_FETCH_CMP(v, c, a) \InterlockedCompareExchange((LONG*)&(v), (LONG)(a), (LONG)c)#define ATOM_LOCK(v) \while(ATOM_SET(v, 1)) \Sleep(0)#define ATOM_UNLOCK(v) \ATOM_SET(v, 0)//否則 如果是 gcc 編譯器
#elif defined(__GNUC__)#include <unistd.h>/*type tmp = v ; v += a ; return tmp ;type 可以是 8,16,32,84 的 int/uint*/
#define ATOM_FETCH_ADD(v, a) \__sync_fetch_add_add(&(v), (a))/*v += a ; return v;*/
#define ATOM_ADD_FETCH(v, a) \
__sync_add_and_fetch(&(v), (a))/*type tmp = v ; v = a; return tmp;*/
#define ATOM_SET(v, a) \__sync_lock_test_and_set(&(v), (a))/*bool b = v == c; b ? v=a : ; return b;*/
#define ATOM_CMP(v, c, a) \__sync_bool_compare_and_swap(&(v), (c), (a))/*type tmp = v ; v == c ? v = a : ;  return v;*/
#define ATOM_FETCH_CMP(v, c, a) \__sync_val_compare_and_swap(&(v), (c), (a))/*加鎖等待,知道 ATOM_SET 返回合適的值_INT_USLEEP 是操作系統(tǒng)等待納秒數(shù),可以優(yōu)化,看具體操作系統(tǒng)使用方式int lock;ATOM_LOCK(lock);//to do think ...ATOM_UNLOCK(lock);*/
#define _INT_USLEEP (2)
#define ATOM_LOCK(v) \while(ATOM_SET(v, 1)) \usleep(_INT_USLEEP)/*對ATOM_LOCK 解鎖, 當(dāng)然 直接調(diào)用相當(dāng)于 v = 0;*/
#define ATOM_UNLOCK(v) \__sync_lock_release(&(v))#endif /*!_MSC_VER && !__GNUC__ */#endif /*!_SC_ATOM*/

這里就是統(tǒng)一簡單包裝gcc?和?VS中提供的?gcc操作.

這里需要說明一下,?gcc?中 __sync__...?是基于編譯器層的?操作.?而?VS中Interlock...?是基于?Windows?api的

有很大不同,這里也只是簡單揉了一下,能用的相似的部分.例如

//忽略 warning C4047: “==”:“void *”與“LONG”的間接級別不同
#pragma warning(disable:4047) // v 和 a 多 long 這樣數(shù)據(jù)
#define ATOM_FETCH_ADD(v, a) \InterlockedExchangeAdd((LONG*)&(v), (LONG)(a))

主要是防止VS?警告和編譯器不通過而改的.?v類型不知道而?InterlockedExchangeAdd?只接受?LONG參數(shù).

?

2.本土個人化接口文件定義

主要見sc_string.h?文件

#ifndef _H_SC_STRING
#define _H_SC_STRING#include <stdint.h>
#include <stddef.h>
#include "sc_atom.h"#define _INT_STRING_PERMANENT    (1)                //標(biāo)識 字符串是持久的相當(dāng)于static
#define _INT_STRING_INTERNING    (2)                //標(biāo)識 字符串在運行時中,和內(nèi)存同生死
#define _INT_STRING_ONSTACK        (4)                //標(biāo)識 字符串分配在棧上//0 潛在 標(biāo)識,這個字符串可以被回收,游離態(tài)#define _INT_INTERNING            (32)            //符號表 字符串大小
#define _INT_ONSTACK            (128)            //棧上內(nèi)存大小struct cstring_data {char* cstr;                                 //保存字符串的內(nèi)容uint32_t hash;                                //字符串hash,如果是棧上的保存大小uint16_t type;                                //主要看 _INT_STRING_* 宏,默認(rèn)0表示臨時串uint16_t ref;                                //引用的個數(shù), 在 type == 0時候才有用
};typedef struct _cstring_buffer {struct cstring_data* str;
} cstring_buffer[1];                            //這個cstring_buffer是一個在棧上分配的的指針類型

typedef struct cstring_data* cstring;            //給外部用的字符串類型/** v : 是一個變量名** 構(gòu)建一個 分配在棧上的字符串.* 對于 cstring_buffer 臨時串,都需要用這個 宏聲明創(chuàng)建聲明,* 之后可以用 CSTRING_CLOSE 關(guān)閉和銷毀這個變量,防止這個變量變成臨時串*/
#define CSTRING_BUFFER(v) \char v##_cstring[_INT_ONSTACK] = { '\0' }; \struct cstring_data v##_cstring_data = { v##_cstring, 0, _INT_STRING_ONSTACK, 0 }; \cstring_buffer v; \v->str = &v##_cstring_data;/** v : CSTRING_BUFFER 聲明的字符串變量* 釋放字符串v,最好成對出現(xiàn),創(chuàng)建和銷毀*/
#define CSTRING_CLOSE(v) \if(0 == (v)->str->type) \cstring_release((v)->str)/** s : cstring_buffer 類型* 方便直接訪問 struct cstring_data 變量*/
#define CSTRING(s) ((s)->str)/** v    : 聲明的常量名,不需要雙引號* cstr : 常量字符串,必須是用 ""括起來的*/
#define CSTRING_LITERAL(v, cstr) \static cstring v; \if (NULL == v) { \cstring tmp = cstring_persist(""cstr, ( sizeof(cstr)/sizeof(char) - 1 )); \if(!ATOM_CMP(v, NULL, tmp)) { \cstring_free_persist(tmp); \} \}/* low level api, don't use directly */
cstring cstring_persist(const char* cstr, size_t sz);
void cstring_free_persist(cstring s);/*public api*/
/** s        : 待處理的串* return    : 處理后永久串,可以返回或使用 * 主要將棧上的串拷貝到臨時堆上或者將臨時堆待釋放的串變到符號表中*/
extern cstring cstring_grab(cstring s);/** s : 待釋放的串* 主要是對臨時堆上的串進行引用計數(shù)刪除*/
extern void cstring_release(cstring s);/** sb        : 字符串保存對象* str        : 拼接的右邊字符串 * return    : 返回拼接好的串 cstring*/
extern cstring cstring_cat(cstring_buffer sb, const char* str);/** sb        : 字符串'池' , 這個字符串庫維護,你只管用* format    : 格式化串,按照這個格式化輸出內(nèi)容到 sb 中* ...        : 可變參數(shù)內(nèi)容* return    : 格式化好的字符串,需要自己釋放** 后面 __attribute format 是在gcc上優(yōu)化編譯行為,按照printf編譯約束來*/
extern cstring cstring_printf(cstring_buffer sb, const char* format, ...)
#ifdef __GNUC____attribute__((format(printf, 2, 3)))
#endif
;/** a        : 字符串a(chǎn)* b        : 字符串b* return    : 當(dāng)a和b不同是直接返回false,相同需要多次比較,相比strcmp 好一些*/
extern int cstring_equal(cstring a, cstring b);/** s        : 字符串s* 為字符串s 生成hash值并返回,除了棧上的會設(shè)置上這個hash值*/
extern uint32_t cstring_hash(cstring s);// 臨時補得一個 日志宏,方便查錯,推薦這些接口 用日志系統(tǒng)代替,是一個整體
#ifndef cerr
#include <stdio.h>
/** 錯誤處理宏,msg必須是""括起來的字符串常量* __FILE__        : 文件全路徑* __func__        : 函數(shù)名* __LINE__        : 行數(shù)行* __VA_ARGS__    : 可變參數(shù)宏,* ##表示直接連接, 例如 a##b <=> ab*/
#define cerr(msg,...) \fprintf(stderr, "[%s:%s:%d]" msg "\n",__FILE__,__func__,__LINE__,##__VA_ARGS__)
#endif#endif /*!_H_SC_STRING*/

以上是重構(gòu)的所有接口,其實就是換皮了.外加了一些解釋.?后面添加了簡單測試宏.?以后在項目中換成內(nèi)部日志系統(tǒng).

?

3.接口文件實現(xiàn)

接口實現(xiàn)文件內(nèi)容多一點

sc_string.c

?

#include "sc_string.h"#include <stdlib.h>
#include <stdarg.h>
#include <string.h>#define _INT_FORMAT_TEMP    (1024)
// 這樣做也是治標(biāo)不治本,保存2k個字符串常量
#define _INT_INTERNING_POOL (2048)
// hash size must be 2 pow
#define _INT_HASH_START 8/** 字符串結(jié)點,可以認(rèn)為是一個桶,鏈表* str  : 字符串具體變量* buf  : 臨時棧上變量,主要為 str.str 用的* next : 下一個字符串結(jié)點*/
struct string_node {struct cstring_data str;char buf[_INT_INTERNING];struct string_node* next;
};/** 認(rèn)為是字符串池,主要保存運行時段字符串變量,存在上限,因系統(tǒng)而定*/
struct string_pool {struct string_node node[_INT_INTERNING_POOL];
};/** 字符串對象的管理器* * lock  : 加鎖用的* size  : hash串的大小* hash  : 串變量* total : 當(dāng)前string_interning 中保存的字符串運行時常量* pool  : 符號表存儲的地方* index : 標(biāo)識pool 堆上保存到哪了*/
struct string_interning {int lock;int size;struct string_node** hash;int total;struct string_pool* pool;int index;
};// 總的字符串管理對象實例化
static struct string_interning __sman = {0, _INT_HASH_START, NULL, 0, NULL, 0
};// 這個 sc_string.c 用到的加鎖解鎖簡化的 宏
#define LOCK() \ATOM_LOCK(__sman.lock)#define UNLOCK() \ATOM_UNLOCK(__sman.lock)/** 將字符串結(jié)點插入到hash表中** struct string_node** hash : 指向字符串鏈表結(jié)點指針的指針,認(rèn)為是hash表* int sz : 新的hash表大小,上面指針的大小,這個值必須是 2的冪* struct string_node* n : 待插入hash表的結(jié)點*/
static void __insert_node(struct string_node** hash, int sz, struct string_node* n)
{uint32_t h = n->str.hash;int idx = h & (sz - 1);n->next = hash[idx];hash[idx] = n;
}/** 為 運行時的 字符串 struct string_interning 變量擴容,重新hash分配* * struct string_interning* si : 字符串池總對象*/
static void __expand(struct string_interning* si)
{int nsize = si->size << 1; //簡單擴容struct string_node** nhash = calloc(nsize, sizeof(struct string_node*));if (NULL == nhash) {cerr("nhash calloc run error, memory insufficient.");exit(EXIT_FAILURE);}if (si->size > _INT_HASH_START) {for (int i = 0; i < si->size; ++i) {struct string_node* node = si->hash[i];while (node) { // 頭結(jié)點會變成尾結(jié)點struct string_node* tmp = node->next;__insert_node(nhash, nsize, node);node = tmp;}}}//釋放原先內(nèi)存,重新回來free(si->hash);si->hash = nhash;si->size = nsize;
}/** 創(chuàng)建一個運行時字符串對象并返回,理解為字符串常量.不需要釋放* * si    : 總的字符串對象* cstr    : 普通字符串量* sz    : cstr需要的處理的長度,這個參數(shù) 必須 < _INT_INTERNING* hs    : 這個字符串cstr的 hs值**        : 返回值 是一個常量字符串的地址,有直接返回,沒有構(gòu)建*/
static cstring __interning(struct string_interning* si, const char* cstr, size_t sz, uint32_t hs)
{//si中hash表為NULL,保存無意義if (NULL == si->hash)return NULL;int sse = si->size;int idx = hs & (sse - 1);struct string_node* n = si->hash[idx];while (n) {if (n->str.hash == hs) if (strcmp(n->str.cstr, cstr) == 0) return &n->str;n = n->next;}// 這里采用的 jshash 函數(shù)不碰撞率 80% (4/5) , 這是經(jīng)驗代碼if (si->total * 5 >= sse * 4)return NULL;if (NULL == si->pool) { //這個不是一個好設(shè)計.為了適應(yīng)struct string_pool*,這種寫死的內(nèi)存塊放在可以放在全局區(qū),但是無法擴展// need not free poolsi->pool = malloc(sizeof(struct string_pool));if (NULL == si->pool) {cerr("si->pool malloc run error, memory insufficient.");exit(EXIT_FAILURE);}si->index = 0;}n = &si->pool->node[si->index++];memcpy(n->buf, cstr, sz);n->buf[sz] = '\0'; //cstr 最后是'\0'
cstring cs = &n->str;cs->cstr = n->buf;cs->hash = hs;cs->type = _INT_STRING_INTERNING;cs->ref = 0;n->next = si->hash[idx];si->hash[idx] = n;return cs;
}/** 生成一個字符串常量,主要放在 __sman.pool 中 ** cstr : 待處理的C字符串* sz    : 字符串長度* hs    : 字符串jshash的值*        : 返回 生成的符號字符串的地址*/
static cstring __cstring_interning(const char* cstr, size_t sz, uint32_t hs)
{cstring srt;LOCK();srt = __interning(&__sman, cstr, sz, hs);if (NULL == srt) {__expand(&__sman); //內(nèi)存擴容srt = __interning(&__sman, cstr, sz, hs);}++__sman.total; //記錄當(dāng)前字符串常量個數(shù)
    UNLOCK();return srt;
}/** jshash實現(xiàn),當(dāng)返回0設(shè)置為1,這里0用作特殊作用,表名初始化狀態(tài)* * buf    : c字符串* len    : 字符集長度*        : 返回生成的字符串hash值*/
static uint32_t __get_hash(const char* buf, size_t len)
{const uint8_t* ptr = (const uint8_t*)buf;size_t h = len; // hash初始化值size_t step = (len >> 5) + 1;for (size_t i = len; i >= step; i -= step)h ^= ((h<<5) + (h>>2) + ptr[i-1]); //將算法導(dǎo)論中東西直接用return h == 0 ? 1 : h;
}/** 拷貝C字符串,并返回地址** cstr        : c字符串* sz        : cstr中處理的長度*            : 返回當(dāng)前字符串地址*/
static cstring __cstring_clone(const char* cstr, size_t sz)
{if (sz < _INT_INTERNING)return __cstring_interning(cstr, sz, __get_hash(cstr, sz));//長的串,這里放在堆上struct cstring_data* p = malloc(sizeof(struct cstring_data) + sizeof(char) * (sz + 1));if(NULL == p){cerr("p malloc run error, memory insufficient.");exit(EXIT_FAILURE);}//ptr 指向后面為容納 cstr申請的內(nèi)存,并初始化一些量void* ptr = p + 1;p->cstr = ptr;p->type = 0;p->ref = 1;memcpy(ptr, cstr, sz);((char*)ptr)[sz] = '\0';p->hash = 0;return p;
}/* low level api, don't use directly */
cstring 
cstring_persist(const char* cstr, size_t sz)
{cstring s = __cstring_clone(cstr, sz);if (0 == s->type) { //沒有放在運行時的常量中s->type = _INT_STRING_PERMANENT; // 標(biāo)識持久的字符串中s->ref = 0;}return s;
}void 
cstring_free_persist(cstring s) //用完釋放,這些api CSTRING_LITERAL宏中自動調(diào)用
{if (s->type == _INT_STRING_PERMANENT)free(s);
}cstring 
cstring_grab(cstring s)
{if (s->type & (_INT_STRING_PERMANENT | _INT_STRING_INTERNING))return s;if (s->type == _INT_STRING_ONSTACK)return __cstring_clone(s->cstr, s->hash);// 后面就是臨時串 type == 0if (0 == s->ref) //沒有引用讓其變?yōu)槌志么?不說內(nèi)存泄露了,就說已經(jīng)釋放內(nèi)存能不能用了都是問題s->type = _INT_STRING_PERMANENT;elseATOM_ADD_FETCH(s->ref, 1);return s;
}void 
cstring_release(cstring s)
{if (0 != s->type)return;if (0 == s->ref)return;ATOM_ADD_FETCH(s->ref, -1); //為了兼容 window特別處理if (s->ref == 0)free(s);
}uint32_t
cstring_hash(cstring s) 
{if (_INT_STRING_ONSTACK == s->type)return __get_hash(s->cstr, s->hash);if (0 == s->hash)s->hash = __get_hash(s->cstr, strlen(s->cstr));return s->hash;
}int 
cstring_equal(cstring a, cstring b)
{if (a == b)return 1;//都是運行時的字符串常量,肯定不同if (a->type == _INT_STRING_INTERNING && b->type == _INT_STRING_INTERNING)return 0;if (a->type == _INT_STRING_ONSTACK && b->type == _INT_STRING_ONSTACK) {if (a->hash != b->hash)return 0;return memcmp(a->cstr, b->cstr, a->hash) == 0;}uint32_t ha = cstring_hash(a);uint32_t hb = cstring_hash(b);if (ha != hb) //hash 能夠確認(rèn)不同,但相同不一定同return 0;return strcmp(a->cstr, b->cstr) == 0;
}/** 拼接c串a(chǎn)和b,可以話放在符號表中,大的話放在臨時區(qū)中** a        : c串a(chǎn)* b        : c串b*            : 返回拼接后的cstring 變量*/
static cstring __cstring_cat(const char* a, const char* b)
{size_t sa = strlen(a);size_t sb = strlen(b);size_t sm = sa + sb;if (sm < _INT_INTERNING) {char tmp[_INT_INTERNING];memcpy(tmp, a, sa);memcpy(tmp + sa, b, sb);tmp[sm] = '\0';return __cstring_interning(tmp, sm, __get_hash(tmp, sm));}//這里同樣走 堆上內(nèi)存分配struct cstring_data* p = malloc(sizeof(struct cstring_data) + sizeof(char) * (sm + 1));if (NULL == p) {cerr("p malloc run error, memory insufficient.");exit(EXIT_FAILURE);}//ptr 指向后面為容納 cstr申請的內(nèi)存,并初始化一些量char* ptr = (char*)(p + 1);p->cstr = ptr;p->type = 0;p->ref = 1;memcpy(ptr, a, sa);memcpy(ptr+sa, b, sb);ptr[sm] = '\0';p->hash = 0;return p;
}cstring 
cstring_cat(cstring_buffer sb, const char* str)
{cstring s = sb->str;if (s->type == _INT_STRING_ONSTACK) {int i = (int)s->hash;while (i < _INT_ONSTACK - 1) {s->cstr[i] = *str;if (*str == '\0') //可以就直接返回,全放在棧上return s;++s->hash;++str;++i;}s->cstr[i] = '\0';}// 棧上放不下,那就 試試 放在運行時中cstring tmp = s; sb->str = __cstring_cat(tmp->cstr, str); // 存在代碼冗余, _INT_ONSTACK > _INT_INTERNING
    cstring_release(tmp);return sb->str;
}/** 根據(jù)模式化字符串,和可變參數(shù)拼接字符串,返回最終拼接的cstring 地址** format        : 模板字符串* ap            : 可變參數(shù)集*                : 返回拼接后的字符串cstring變量*/
static cstring __cstring_format(const char* format, va_list ap)
{static char* __cache = NULL; //持久化數(shù)據(jù),編譯器維護char* rt;char* tmp = __cache;// read __cache buffer atomicif (tmp) {//tmp 獲取 __cache值, 如果 __cache == tmp ,會讓 __cache = NULLtmp = ATOM_FETCH_CMP(__cache, tmp, NULL);}if (NULL == tmp) {tmp = malloc(sizeof(char) * _INT_FORMAT_TEMP);if (NULL == tmp) {cerr("tmp malloc run error, memory insufficient.");exit(EXIT_FAILURE);}}int n = vsnprintf(tmp, _INT_FORMAT_TEMP, format, ap);if (n >= _INT_FORMAT_TEMP) {int sz = _INT_FORMAT_TEMP << 1;for (;;) {rt = malloc(sizeof(char)*sz);if (NULL == rt) {cerr("rt malloc run error, memory insufficient.");exit(EXIT_FAILURE);}n = vsnprintf(rt, sz, format, ap);if (n < sz)break;//重新開始,期待未來free(rt);sz <<= 1;}}else {rt = tmp;}cstring r = malloc(sizeof(struct cstring_data) + (n+1)*sizeof(char));if (NULL == r) {cerr("r malloc run error, memory insufficient.");exit(EXIT_FAILURE);}r->cstr = (char*)(r + 1);r->type = 0;r->ref = 1;r->hash = 0;memcpy(r->cstr, rt, n+1);// tmp != rt 時候, rt 構(gòu)建臨時區(qū)為 臨時的if (tmp != rt) free(rt);//save tmp atomicif (!ATOM_CMP(__cache, NULL, tmp))free(tmp);return r;
}cstring
cstring_printf(cstring_buffer sb, const char* format, ...)
{cstring s = sb->str;va_list ap;va_start(ap, format);if (s->type == _INT_STRING_ONSTACK) {int n = vsnprintf(s->cstr, _INT_ONSTACK, format, ap);if (n >= _INT_ONSTACK) {s = __cstring_format(format, ap);sb->str = s;}elses->hash = n;}else {cstring_release(sb->str);s = __cstring_format(format, ap);sb->str = s;}va_end(ap);return s;
}

到這里基本結(jié)構(gòu)就完成了.?簡單說一下,當(dāng)我寫到下面這塊

?

void 
cstring_free_persist(cstring s) //用完釋放,這些api CSTRING_LITERAL宏中自動調(diào)用
{if (s->type == _INT_STRING_PERMANENT)free(s);
}cstring 
cstring_grab(cstring s)
{if (s->type & (_INT_STRING_PERMANENT | _INT_STRING_INTERNING))return s;if (s->type == _INT_STRING_ONSTACK)return __cstring_clone(s->cstr, s->hash);// 后面就是臨時串 type == 0if (0 == s->ref) //沒有引用讓其變?yōu)槌志么?不說內(nèi)存泄露了,就說已經(jīng)釋放內(nèi)存能不能用了都是問題s->type = _INT_STRING_PERMANENT;elseATOM_ADD_FETCH(s->ref, 1);return s;
}void 
cstring_release(cstring s)
{if (0 != s->type)return;if (0 == s->ref)return;ATOM_ADD_FETCH(s->ref, -1); //為了兼容 window特別處理if (s->ref == 0)free(s);
}

補充說明一下,這里??ATOM_ADD_FETCH?返回的是 %hu?的零,?但是?if ((hu)0 == -1)卻不等,這是?數(shù)據(jù)格式默認(rèn)變成LONG比較的結(jié)果.

所以先進行原子操作,再去處理數(shù)據(jù).?屬于一個隱含的知識點.

擴展一下,?當(dāng)我們用VS2015?或者說Microsoft?系列IDE寫C程序,都是偽C代碼,走的是C++編譯器的extern "C"?部分.?比較惡心.

對于VS?DEBUG?模式下檢測內(nèi)存?的方式是,?在你申請內(nèi)存時候額外添加空間,free時候回檢測,這也就是他檢測內(nèi)存異常而定手段.

具體見

// Tests the array of size bytes starting at first.  Returns true if all of the
// bytes in the array have the given value; returns false otherwise.
static bool __cdecl check_bytes(unsigned char const* const first,unsigned char        const value,size_t               const size) throw()
{unsigned char const* const last{first + size};for (unsigned char const* it{first}; it != last; ++it){if (*it != value)return false;}return true;
}

這里再擴展一下,自己的多個IDE編程感受,?用gcc的時候你需要小心翼翼,明白很多細節(jié),否則?直接跪了.?而用VS開發(fā),很大方去你媽,不懂沒關(guān)系

就是亂寫,編譯調(diào)試都不用太關(guān)心,省了1半開發(fā)調(diào)試時間.只高不低,生產(chǎn)力提升了.技術(shù)下降了.真希望Linux?上有個可視化的VS.

到這里擴展結(jié)束,繼續(xù)說一下,它坑的地方

特別是對于?cstring_grab?中 0 ==?s->ref?的時候,?這時候?s?是一個被釋放的臨時串.?這樣改個類型就直接返回了,相當(dāng)于

使用已經(jīng)釋放的內(nèi)存,多恐怖.

就是到這里,?感覺這個玩具已經(jīng)扶不起來,例如

cstring_cat => cstring_release =>cstring_grab?這種程序崩了.如下

    // 測試內(nèi)存混亂puts("\n--新的測試開始--\n");CSTRING_BUFFER(cu);cstring ks = cstring_cat(cu, "你好111111111111111111111111111111111111111111111111111111111111111111111111111111""好的11111111111111111111111111111111111111111111111111111111111111111111111111111111111""坑啊22222222222222222222222222222222222222222222222222222222222222222222222222222222222""你能力比我強,強改只會走火入魔,坑""1111111111111111111111111111111111112222222222222222222222222222222222222222222222222222222222");printf("type:%u, ref:%u, cstr:%s\n",ks->type, ks->ref, ks->cstr);CSTRING_CLOSE(cu);//這里繼續(xù)使用這個串cstring bks = cstring_grab(ks); // 它也沒有起死回生的能力,代碼崩掉printf("type:%u, ref:%u, cstr:%s\n", bks->type, bks->ref, bks->cstr);

代碼一執(zhí)行,程序就崩了.

不想改了,?強改比自己能力強的?設(shè)計問題 容易引火焚身.

大家注意一下,有好想法,?可以試試,改好了分享.?我的感覺內(nèi)存?管理方式隱含的太多了.?有點亂.絕逼內(nèi)存泄露,畢竟讓別人用.

?

4.運行實例

首先看原始的測試demo

test.c

#include "sc_string.h"#include <stdio.h>static cstring __foo(cstring t) 
{CSTRING_LITERAL(hello, "hello");CSTRING_BUFFER(ret);if (cstring_equal(hello, t))cstring_cat(ret, "equal");else cstring_cat(ret, "not equal");return cstring_grab(CSTRING(ret));
}static void __test() 
{CSTRING_BUFFER(a);cstring_printf(a, "%s", "hello");cstring b = __foo(CSTRING(a));printf("%s\n", b->cstr);cstring_printf(a, "very long string %01024d", 0);printf("%s\n", CSTRING(a)->cstr);CSTRING_CLOSE(a);cstring_release(b);
}int main(void) 
{__test();#ifdef _MSC_VER system("pause");
#endif // !_MSC_VERreturn 0;
}

window?運行結(jié)果

?

到這里window?上基本都跑起來,?現(xiàn)在我們在gcc上測試一下.?首先需要將這些文件上傳到Linux服務(wù)器上,上傳之前統(tǒng)一用utf-8編碼保存.

?上面是Linux?跑的結(jié)果,?其中Makefile?文件內(nèi)容如下

test.out : test.c sc_string.cgcc -g -Wall -march=native -o $@ $^

到這里?這個高級玩具要告一段落.?還有好多坑,這里就沒說了.?例如?cstring_cat?cstring_printf?這樣分配太慢了,?搞一次不行又重頭搞一次,?前面都是無用功.

但作為玩具已經(jīng)夠炫了.期待云風(fēng)前輩重構(gòu)成?實戰(zhàn)級別的?c字符串,?反正我進過這次教訓(xùn),覺得C中?char*,const?char*,?const?char *?const?夠用了.

?

后記

  大家有機會可以去cloudwn ?githup?上?下載?cstring-master?玩玩,?感受一下別人的代碼習(xí)慣和風(fēng)格和設(shè)計思路.

有機會下次分享?實戰(zhàn)中的簡單日志庫.?歡迎吐槽,因為技術(shù)很菜總有不懂地方和錯誤的地方.

?

轉(zhuǎn)載于:https://www.cnblogs.com/life2refuel/p/5095586.html

總結(jié)

以上是生活随笔為你收集整理的对云风 cstring 第二次解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产五月色婷婷六月丁香视频 | 亚洲日本精品视频 | 亚洲欧美国产精品va在线观看 | 欧美最爽乱淫视频播放 | 午夜久久福利影院 | 久久久不卡影院 | 9ⅰ精品久久久久久久久中文字幕 | 91在线中文字幕 | 色偷偷97 | 黄色在线观看免费网站 | 久久一视频 | 免费在线电影网址大全 | 激情av在线资源 | 91你懂的| 一区二区三区中文字幕在线观看 | 国产色拍拍拍拍在线精品 | 99热国产在线观看 | 成年人在线看片 | 狠狠躁日日躁夜夜躁av | 成人一级黄色片 | 国产原厂视频在线观看 | 国产日韩高清在线 | 天天操夜夜操天天射 | 国产男男gay做爰 | 亚洲欧洲精品一区二区精品久久久 | 国产精品99久久久久的智能播放 | 亚洲高清在线观看视频 | 在线观看成人一级片 | 免费看一级特黄a大片 | 13日本xxxxxⅹxxx20 | 91视频在线 | 人人爽夜夜爽 | 日韩av成人免费看 | 中文字幕视频网 | 亚洲日本成人 | 国产精品久久久久一区二区三区 | 91香蕉视频色版 | 久久公开视频 | 久久久首页 | 中文字幕xxxx | 婷婷色av | 国产精品日韩欧美 | 欧美一级艳片视频免费观看 | 日韩在线视频一区二区三区 | 最新国产精品亚洲 | 一区二区三区高清在线 | 久久久久电影 | 国产精品久久久免费 | 在线观看中文字幕一区 | 久草在线视频网 | 日日操日日 | 麻豆免费在线播放 | 视频一区二区免费 | 欧美日韩一区二区三区在线免费观看 | 欧美日韩国产页 | 国产福利在线不卡 | 日韩精品在线看 | 一本一道久久a久久精品蜜桃 | 婷婷丁香在线视频 | 91视频 - x99av | 黄色avwww| 在线97| 久久精品视频播放 | 日韩成人精品在线观看 | 伊人中文网 | 在线日韩中文字幕 | 久草在线久草在线2 | 婷婷综合久久 | 日韩精品一区二区三区免费观看视频 | 81精品国产乱码久久久久久 | 日韩天堂网 | 婷婷综合导航 | 黄在线| 久久男人中文字幕资源站 | 在线观看中文字幕视频 | 人人揉人人揉人人揉人人揉97 | 99国产在线观看 | 精品中文字幕视频 | 午夜手机电影 | 激情欧美一区二区三区 | 91在线视频精品 | av黄色大片 | 久久综合九色综合欧美狠狠 | 91中文视频 | 五月天天在线 | 在线免费高清视频 | 天天干 天天摸 天天操 | 日韩在线网址 | 波多野结衣视频一区二区三区 | 色综合网在线 | 久久久精品成人 | 亚洲电影免费 | 91久久国产综合精品女同国语 | 国产剧情一区二区 | 99成人精品 | 国产亚洲精品久久久久久无几年桃 | 最近日本字幕mv免费观看在线 | 丁香5月婷婷久久 | 天天操夜夜逼 | 久久精品视频免费 | 亚洲一片黄 | 久久网站最新地址 | 国产一区二区免费在线观看 | 人人干狠狠干 | 欧美在一区 | 国产伦精品一区二区三区在线 | 日韩网站在线 | 国产五码一区 | 国产专区视频在线观看 | 久久久久久毛片精品免费不卡 | 一区二区在线影院 | 夜夜躁狠狠躁日日躁视频黑人 | 国产1级毛片 | 久草a在线 | 亚洲精品自拍视频在线观看 | 国产精品一区二区三区观看 | 国产精品久久久久久久久久 | 亚洲人成网站精品片在线观看 | 天天操狠狠操 | 国产手机在线播放 | 99亚洲国产 | 色综合天天在线 | 中文在线字幕免 | 亚洲乱码精品久久久久 | 色婷婷综合视频在线观看 | 精品国产一二三四区 | aaawww| 国产精品刺激对白麻豆99 | 激情久久久久久久久久久久久久久久 | av在线a| 99热超碰在线| 国产午夜剧场 | 91丨精品丨蝌蚪丨白丝jk | 一本一本久久a久久 | 81精品国产乱码久久久久久 | 午夜精品av在线 | 狠狠的操狠狠的干 | 久久国产免费 | 亚洲综合成人婷婷小说 | www.xxx.性狂虐 | 激情久久网 | 99色免费视频 | 男女男视频 | 国产九九精品视频 | 久久免费试看 | 亚洲精品在线视频观看 | 久久精品人 | 欧美国产日韩在线观看 | 免费在线观看av的网站 | 高清免费在线视频 | 99热日本| 99精品在线免费观看 | 亚洲国产中文字幕在线观看 | 成人影音av | 97精品久久人人爽人人爽 | 久久乐九色婷婷综合色狠狠182 | 国产精品久久久久久久久久白浆 | 免费精品国产va自在自线 | 日日躁天天躁 | 欧美男同网站 | 97超碰免费在线 | 日韩二区在线观看 | 久艹在线观看视频 | 日韩欧美高清一区二区 | 亚洲国产欧美在线人成大黄瓜 | 人人狠| 亚洲最新av在线网站 | 国产亚洲视频在线 | 色是在线视频 | www.香蕉视频在线观看 | 在线视频欧美精品 | 亚洲高清国产视频 | 肉色欧美久久久久久久免费看 | 91成人精品一区在线播放69 | 黄污视频网站大全 | 国产又粗又猛又色 | 国产精品久久久久久久久久久不卡 | 欧美va在线观看 | 日韩av资源在线观看 | 亚洲视频一区二区三区在线观看 | 中文字幕亚洲精品日韩 | 干干操操| 久久国产经典视频 | 久久国产精品免费视频 | 在线观看mv的中文字幕网站 | 免费色视频在线 | 四虎成人精品永久免费av | 在线视频中文字幕一区 | 国产一区欧美二区 | 亚洲精品视频网站在线观看 | 久久国产日韩 | 国产黄在线 | 色综合天天狠狠 | 国产九九在线 | 国产精品久久久久久久久久免费看 | 天堂中文在线播放 | www久久精品 | 欧美在线一级片 | 国产高清视频在线免费观看 | 国产精品久久久久久一区二区三区 | www狠狠操 | 亚洲精品免费在线观看 | 在线黄色av电影 | www黄色| aaa毛片视频 | 91免费视频国产 | 精品在线不卡 | 国产视频在线观看一区二区 | 一区二区三区四区免费视频 | 日韩在线免费电影 | 九九九九免费视频 | 国产va饥渴难耐女保洁员在线观看 | 天天操天天射天天爽 | 亚洲最新视频在线 | 精品国产乱子伦一区二区 | 日韩aⅴ视频| 中文字幕在线不卡国产视频 | 久久免费激情视频 | 激情五月婷婷 | 国模吧一区 | 97色婷婷 | 中文字幕观看在线 | 在线激情av电影 | 国产精品一区二区久久久 | 成片人卡1卡2卡3手机免费看 | 欧美analxxxx| 成人av电影在线播放 | 人人爽人人做 | 二区三区视频 | 国产原厂视频在线观看 | 狠狠天天 | 伊人热 | 国产午夜三级一二三区 | 黄色激情网址 | 国产人成在线视频 | 激情欧美一区二区免费视频 | 国产va饥渴难耐女保洁员在线观看 | 特黄特黄的视频 | 91欧美精品| 青青草久草在线 | 在线免费观看黄色 | 欧美日韩在线播放 | 精品自拍sae8—视频 | 在线欧美小视频 | 一级特黄av | 天天躁天天躁天天躁婷 | 免费久久网 | 久久免费中文视频 | 中文字幕在线影视资源 | 久久九九影院 | 成人a毛片 | 日本激情视频中文字幕 | 亚洲三级视频 | 色悠悠久久综合 | 人人讲| 黄色电影在线免费观看 | 久草网站在线 | 玖玖玖影院 | 免费午夜av | 免费看特级毛片 | 亚洲精品视频二区 | 日韩欧美有码在线 | 亚洲精品国产麻豆 | www四虎影院 | 绯色av一区| 91亚洲国产 | 成人小电影在线看 | 在线免费观看羞羞视频 | 亚洲一区二区三区四区精品 | 久久美女视频 | 91cn国产在线 | 一区二区三区韩国免费中文网站 | 美女久久 | 少妇高潮冒白浆 | 久久久免费精品视频 | 日韩精品免费在线视频 | 九九爱免费视频 | 亚洲黄色软件 | 精品专区 | 九九久久免费视频 | 九九免费观看视频 | 成年人电影免费看 | www国产亚洲 | 天海翼一区二区三区免费 | 99在线热播精品免费99热 | 成人久久18免费网站图片 | 一级免费观看 | 日韩一二区在线观看 | 91麻豆国产福利在线观看 | 国产成人精品一区二三区 | 久久狠狠亚洲综合 | 欧美日韩国产精品一区 | 91九色最新| 在线观看a视频 | 麻豆网站免费观看 | 久久久99精品免费观看乱色 | 丰满少妇对白在线偷拍 | 日本韩国精品一区二区在线观看 | 一级片免费在线 | 亚洲精品在线一区二区 | 久久污视频 | 精品国产理论 | 久久精品免费观看 | 黄网站免费大全入口 | 中文字幕精| 国产日韩在线看 | 日韩精品三区四区 | 欧美日韩电影在线播放 | 国产成人一区二区三区免费看 | 午夜精品一区二区三区在线 | 国产午夜小视频 | 亚洲激情六月 | 精品国产一区二区三区不卡 | 最近中文字幕在线中文高清版 | 人人狠狠综合久久亚洲婷 | 九九热精品国产 | 国产欧美日韩视频 | 国产一级片免费观看 | 亚洲电影网站 | 久久99这里只有精品 | 丝袜+亚洲+另类+欧美+变态 | 免费久久99精品国产 | 免费视频久久久久久久 | 成人在线黄色 | 国产精品1区2区3区在线观看 | 国色天香在线观看 | 中文字幕乱码日本亚洲一区二区 | www.久久爱.cn | avwww在线观看 | av在线播放不卡 | 玖玖国产精品视频 | 亚洲精品久久激情国产片 | 亚洲视频精品 | 天天插夜夜操 | 精品国产免费观看 | 日韩精品免费一线在线观看 | 色综合天天综合网国产成人网 | 婷五月激情 | 少妇bbbb搡bbbb搡bbbb | 久久久久久久久免费视频 | 亚洲精品视频在线 | 久久成 | 美女网站视频久久 | 国产精品地址 | 中文字幕在线一区二区三区 | 亚洲视频99 | 五月婷网| 高清av网 | 日韩区视频 | 91九色在线视频 | 一区二区三区精品在线 | 国产精品久久久久久久久久久久久久 | 日韩一区二区三免费高清在线观看 | 日韩三级.com | 午夜精品久久久久久久久久久久 | 日韩中文字幕在线观看 | 国产精品久久久久久爽爽爽 | 免费看国产曰批40分钟 | 91麻豆高清视频 | 精品久久久久久亚洲综合网 | 免费福利视频导航 | 91少妇精拍在线播放 | 国内精品久久久久久久久久 | 在线观看中文字幕av | 国产成a人亚洲精v品在线观看 | 久久日韩精品 | 91在线91 | 国产高潮久久 | 久久久久 | 在线一二区 | 国产第一页福利影院 | 久草久草在线观看 | 久久精品2| 久久久九九| 国产精品18久久久久久久网站 | 国产在线a不卡 | 九九九国产 | 在线综合 亚洲 欧美在线视频 | 麻豆免费视频观看 | 日韩在线免费 | 免费视频 你懂的 | 欧美在线视频一区二区 | 国产精品麻豆91 | 国产一级视频在线 | 亚洲欧美视频在线 | 久久影视中文字幕 | 国产精品久久久久一区二区三区 | 国产专区在线看 | 黄色国产高清 | 国产伦精品一区二区三区高清 | 日韩视频一区二区在线观看 | 欧美精品久久久久久久久久久 | 国产精品美女久久久 | 免费网站v | 毛片99 | 国产电影一区二区三区四区 | 欧美日韩精品在线视频 | 久久久久日本精品一区二区三区 | 人人精久| 欧美日本不卡高清 | 狠狠干美女 | 日本成人免费在线观看 | 日韩在线视频看看 | 色吧av色av | 成年人在线观看免费视频 | 亚洲精品高清视频在线观看 | 国产精品av在线免费观看 | 激情视频一区 | 日韩大片在线免费观看 | 永久免费的av电影 | 四虎影院在线观看av | 99久久婷婷国产精品综合 | 日本中文字幕电影在线免费观看 | 一区二区三区韩国免费中文网站 | 久草在线综合 | 国产精品久久久久久久久久 | 天天天天天天天操 | 99精品免费久久久久久久久 | 中文字幕在线观看免费高清电影 | 国产一级视频在线免费观看 | 深爱五月激情五月 | 日韩色视频在线观看 | 国内综合精品午夜久久资源 | 黄色网中文字幕 | 精品一区二区三区久久久 | 在线成人免费电影 | 久久精品综合一区 | 国产一及片 | 国产亚洲精品免费 | 亚洲欧洲在线视频 | 亚洲专区欧美 | 国产中文视频 | 日韩欧美在线视频一区二区三区 | 九色porny真实丨国产18 | 在线免费观看黄色av | 免费一级片观看 | 国产五月天婷婷 | 探花视频免费在线观看 | 久久精品国产成人精品 | 亚洲 欧美 成人 | 久碰视频在线观看 | 日韩视频免费观看高清完整版在线 | 久久精品国产免费看久久精品 | 91一区二区在线 | 国产小视频国产精品 | 欧美一区三区四区 | 一区二区视频在线观看免费 | 色福利网站 | 91九色蝌蚪国产 | 日韩电影在线一区 | 日韩高清在线看 | 精品理论片| av片在线观看免费 | 久草在线免费看视频 | h视频日本 | 99亚洲国产 | 久久九九国产视频 | 国产一级视频 | 亚洲一级片免费观看 | 色综合天天干 | 91九色在线视频 | 国产剧情av在线播放 | 精品久久久久国产免费第一页 | 国内精品久久久久影院一蜜桃 | 国产成人精品亚洲日本在线观看 | 99精品视频播放 | 操少妇视频 | 国产1区2区3区精品美女 | 欧美色综合天天久久综合精品 | 97色综合 | 日韩亚洲精品电影 | 亚洲一级片 | 成人免费在线播放 | 日本中文字幕免费观看 | 久久久久成人精品免费播放动漫 | 国产精品九九九九九 | 综合色亚洲 | 亚洲精品综合一二三区在线观看 | 国产精品女教师 | 91免费视频网站在线观看 | 午夜精品导航 | 国产免费高清视频 | 深爱激情五月网 | 丁香婷五月 | 99这里只有精品视频 | 亚洲精品视频二区 | 超碰人人舔 | 天天做天天爱天天综合网 | 国产精品男女啪啪 | 色偷偷888欧美精品久久久 | 婷婷色综合 | 国产精品麻豆99久久久久久 | 婷婷日日 | 久久久久久毛片精品免费不卡 | 97视频在线免费观看 | 五月婷婷影视 | 五月天综合 | 国产成人久久久77777 | av亚洲产国偷v产偷v自拍小说 | 日韩欧美国产免费播放 | 在线观看亚洲成人 | 人人爽人人射 | 中文字幕人成乱码在线观看 | 国产精品一区二区三区在线免费观看 | 国产精品久久久久久久久久久久午夜 | 精品在线播放 | 99精品黄色| 777久久久| 99久久99久久精品国产片 | 婷婷色六月天 | 欧美成人tv | av在线看网站 | 国产黄| 久草免费在线视频 | 日韩激情av在线 | 亚洲欧洲日韩 | 亚洲视频 一区 | 国产精品va视频 | 日日干网 | 在线免费观看视频一区二区三区 | av一区在线播放 | 91热在线| 最新色视频| 国内三级在线观看 | 精品女同一区二区三区在线观看 | 在线精品观看 | 黄色av网站在线免费观看 | 日韩免费电影在线观看 | 三上悠亚一区二区在线观看 | 91亚洲狠狠婷婷综合久久久 | 欧美a级在线免费观看 | 在线播放 日韩专区 | 成人午夜在线电影 | 久久久久久国产精品999 | 日日干夜夜干 | 一区二区三区免费在线观看 | 免费h漫在线观看 | 99精品欧美一区二区 | 婷婷丁香色综合狠狠色 | 国产人成在线视频 | 午夜精品视频免费在线观看 | 99爱这里只有精品 | 四虎免费av | 91人人爽久久涩噜噜噜 | 亚洲国产成人在线观看 | 日韩在线一区二区免费 | 欧美 亚洲 另类 激情 另类 | 日韩最新av在线 | 亚洲精品午夜aaa久久久 | 天天草综合网 | 亚洲乱码中文字幕综合 | 亚洲成av人电影 | 国产精品久久久久久久午夜片 | 波多野结衣日韩 | 伊人va| 成人免费看片网址 | 久久视了 | 97精品欧美91久久久久久 | 草久久久久久 | 婷婷九月激情 | 国产激情小视频在线观看 | 中国黄色一级大片 | 一区二区三区久久精品 | 亚洲成人黄色网址 | 主播av在线 | 国产精品久久久久久久99 | 国产 字幕 制服 中文 在线 | 国产区欧美 | 国产一级高清 | 91精品国产自产在线观看 | 天天爽夜夜爽精品视频婷婷 | 国产 日韩 在线 亚洲 字幕 中文 | 日韩一区二区免费播放 | 狠狠地日 | 久久av黄色 | 国模吧一区 | 日日干日日 | 中文字幕在线视频精品 | 久久精品99 | 中文字幕一区二区三区四区视频 | 91在线免费公开视频 | 国产伦精品一区二区三区… | 一区三区在线欧 | 国产免费观看视频 | 五月亚洲综合 | 国内精品久久久久久久久久久久 | av免费观看高清 | 在线精品视频在线观看高清 | 91精品国产福利 | 夜夜操狠狠操 | 国产免费成人 | 成年人国产视频 | 午夜影院日本 | 久久精品草 | 伊人伊成久久人综合网小说 | 干狠狠| 亚洲日本一区二区在线 | 亚洲国产中文字幕在线观看 | 黄色三级免费看 | 四虎永久视频 | 亚洲国产成人精品电影在线观看 | 国产色视频| 午夜电影 电影 | 天天操天天射天天 | 在线黄色毛片 | 91色在线观看 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 久久免费国产精品1 | 丁香六月婷婷开心婷婷网 | 久久影视一区 | 国产一区二三区好的 | 国产成人免费观看久久久 | 一级黄色视屏 | 日日麻批40分钟视频免费观看 | 国产成人一区二区三区影院在线 | 五月婷婷综合久久 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 97在线视频免费观看 | 亚洲va欧美va国产va黑人 | 中文字幕在线观看1 | 91看片淫黄大片一级在线观看 | 香蕉久久久久 | 六月丁香在线观看 | 亚洲电影第一页av | av在线免费不卡 | 亚洲综合五月 | 欧美少妇bbwhd | 欧美日韩国产免费视频 | 91毛片在线观看 | 91在线www| 9色在线视频 | 国产精品毛片完整版 | 亚洲 欧美 国产 va在线影院 | 岛国一区在线 | 欧美国产精品久久久久久免费 | 99热精品久久 | www国产亚洲精品久久网站 | 中文十次啦 | av福利超碰网站 | 国产在线观看av | 中文字字幕在线 | 91一区啪爱嗯打偷拍欧美 | 国产拍揄自揄精品视频麻豆 | 久久夜夜夜 | 久久99九九99精品 | 亚洲美女视频网 | 成年人毛片在线观看 | 91av片| 国产无遮挡猛进猛出免费软件 | 免费电影一区二区三区 | 国产91影院| 国产精品久久久久久高潮 | 久久dvd | 免费观看的黄色片 | 最近免费中文字幕 | 久久不卡电影 | 一级一片免费观看 | 香蕉视频在线免费 | 欧美巨大| 操操日| www亚洲国产 | 欧美黄网站 | 欧美天天综合网 | 国产福利网站 | 日韩视频一区二区三区 | 亚洲网站在线 | 91传媒91久久久 | 精品一区免费 | 亚洲美女久久 | 午夜少妇一区二区三区 | 精品一区二区三区香蕉蜜桃 | 精品国产一二三四区 | 国产小视频在线播放 | 波多野结衣一区二区 | 亚洲爱爱视频 | 亚洲综合丁香 | 手机在线免费av | 日韩午夜剧场 | 日韩mv欧美mv国产精品 | 99热在线这里只有精品 | 久久精品视频日本 | 久久理论视频 | 久久免费视频99 | 久久免费视频网站 | av一区在线 | 国产在线欧美 | a级片韩国 | 在线视频你懂 | 91免费视频网站在线观看 | 国产一级在线 | 日韩网站在线播放 | 国产精品久久久久久久av电影 | 久久人网| 亚洲一区不卡视频 | 99精品乱码国产在线观看 | 国产一级免费观看 | www国产精品com| 999在线视频| 黄色av高清 | 日韩在线观看中文字幕 | 久久精品一二三区 | 国产精品久久久久影院日本 | 久久99精品久久久久蜜臀 | 国产精品久久久久久麻豆一区 | 国产精品美女久久久 | 国产精品久久久久影视 | 日韩r级电影在线观看 | 免费在线一区二区三区 | 国产香蕉久久精品综合网 | 亚洲激情在线观看 | 亚洲区另类春色综合小说 | 在线视频观看成人 | 欧美成人在线免费观看 | 天天操夜夜拍 | 日韩在线高清视频 | 国产亚洲精品久久久久久久久久久久 | 亚洲精品18日本一区app | 欧美日韩二区在线 | 五月天激情综合 | 日韩在线免费看 | 手机av在线免费观看 | 9797在线看片亚洲精品 | 国产很黄很色的视频 | 四虎在线免费视频 | 日韩高清 一区 | 一区二区精品国产 | 午夜在线免费观看视频 | 91在线视频在线 | 欧美日韩国产精品久久 | 91精品一区国产高清在线gif | 国产成人精品午夜在线播放 | 久久久国产成人 | 黄色一区二区在线观看 | av日韩国产 | 国产精品久久久久久久久久久久午夜 | 亚洲黄色影院 | 久久爱导航 | 国产黄在线 | 日韩av一区二区在线影视 | 亚洲高清资源 | 日韩在线网址 | 国产精品地址 | 国产精品网址在线观看 | 亚洲另类视频在线 | 国产一级在线看 | 深夜免费福利网站 | 色婷婷88av视频一二三区 | 久久久在线视频 | 一二三区av | 五月天六月丁香 | 国产一区网址 | 三级黄色大片在线观看 | 手机成人av| av中文字幕电影 | 久久久免费 | 欧美日韩在线观看一区二区三区 | 一区二区三区在线影院 | 国产一线天在线观看 | 2023国产精品自产拍在线观看 | 亚洲黄色在线免费观看 | 日韩视频免费在线 | www.亚洲视频.com| 国产精品手机在线播放 | 中文字幕丝袜 | 久久av免费观看 | 日日夜夜天天干 | 黄色毛片视频免费观看中文 | 日韩高清精品免费观看 | 免费看污网站 | 日韩在线视频观看免费 | 国产色在线观看 | 久久这里只精品 | 国产人成看黄久久久久久久久 | 狠狠操天天干 | 国产一区二区三区免费观看视频 | 一区二区三区视频网站 | 中文字幕亚洲国产 | 欧美日韩在线视频观看 | 97在线影视 | 日韩精品一区二区三区外面 | 久99久视频| www.色婷婷.com| 日本激情动作片免费看 | 久久久久| 欧美大荫蒂xxx | 久久久久久不卡 | 亚洲激精日韩激精欧美精品 | 日韩欧美aaa | 国产原创av片 | 91视视频在线直接观看在线看网页在线看 | 激情网婷婷 | 六月久久婷婷 | 99在线热播精品免费 | 欧美性性网 | 亚洲成人午夜av | av黄色免费网站 | a午夜电影 | www.97色.com | 制服丝袜天堂 | 一区二区三区四区免费视频 | 99精品热视频只有精品10 | 日韩在线观看高清 | 欧美成人性战久久 | 一本一本久久a久久精品综合小说 | 精品一区91 | 亚洲乱码中文字幕综合 | 国产精品久久久久久电影 | 操操操影院 | 日韩色中色 | 天天爽网站 | 99久热在线精品视频观看 | 亚洲桃花综合 | 国产在线观看你懂的 | 欧美整片sss | 国产一区精品在线观看 | 国产中文字幕视频在线观看 | 国产91国语对白在线 | 久久视频 | 中文字幕免费高 | 黄色av影视 | 99欧美视频 | 国产精品久久久久999 | 免费精品在线观看 | 中文字幕乱码视频 | 欧美精品久久 | 国产一级做a | 久久久亚洲影院 | 亚洲精品女人久久久 | 国产精品一区二区麻豆 | 最近免费中文字幕大全高清10 | 欧美一区二区三区在线看 | 久操视频在线 | 欧美黑吊大战白妞欧美 | 探花视频在线观看免费版 | 久久久久久久久影院 | 午夜精品久久久久久久99 | av中文字幕在线免费观看 | 亚洲 欧美 日韩 综合 | 97成人在线免费视频 | 亚洲人精品午夜 | 97超碰国产精品 | 国产亚洲小视频 | 欧美最猛性xxxxx(亚洲精品) | 99国产一区二区三精品乱码 | 国内成人av | 中文字幕在线播放一区二区 | 久久久91精品国产一区二区三区 | 天天射天天干天天爽 | 精品国产免费av | 在线视频免费观看 | 国产黄免费在线观看 | 亚洲欧美国产精品久久久久 | 在线观看av不卡 | 久久久黄色免费网站 | 久久久久区 | 99热超碰 | 亚洲精品在线网站 | 精品一区二区久久久久久久网站 | 免费视频一区 | av在线免费观看不卡 | 91女子私密保健养生少妇 | 国产一区在线播放 | 免费久久精品视频 | 欧洲精品码一区二区三区免费看 | 国产a国产a国产a | 97视频在线免费观看 | 五月婷婷在线观看视频 | 91免费黄视频 | 91精品国产自产91精品 | 日韩免费视频在线观看 | 日韩在线| 综合黄色网 | 色香com.| 在线影院av | 日韩午夜一级片 | 成人国产精品久久久久久亚洲 | 久久综合狠狠综合 | 成人在线播放网站 | 国产一级片一区二区三区 | www·22com天天操 | 成人国产精品av | 天天综合网天天综合色 | 91最新在线视频 | 欧美色图视频一区 | 一区二区三区免费在线播放 | 探花视频免费在线观看 | 涩涩网站免费 | av日韩精品 | 人人爽人人乐 | 天天干天天操天天射 | 精品1区二区 | 99r在线播放 | 色综合天天狠天天透天天伊人 | 国产午夜精品一区二区三区在线观看 | 国产五月 | www91在线 | 国产电影黄色av | 精品视频免费观看 | 国产成人精品av在线 | 精品久久久久国产免费第一页 | 456免费视频| 手机看片 | 亚洲精品视频免费在线观看 | 日韩欧美区 | 亚洲五月 | 久久成人高清 | 国产精品黑丝在线观看 | 亚洲闷骚少妇在线观看网站 | 亚州精品在线视频 | www好男人 | 国产三级视频在线 | 亚洲免费精彩视频 | 91精品国产欧美一区二区成人 | 99综合电影在线视频 | 在线免费观看国产视频 | 日本精品视频网站 | 欧美国产日韩一区 | 成人黄色av网站 | 天天干天天草天天爽 | 国内精品久久影院 | 色偷偷88欧美精品久久久 | 国产精品aⅴ| 在线中文字幕一区二区 | 久久黄色免费视频 | 国产精品手机视频 | 97人人添人澡人人爽超碰动图 | 免费观看国产视频 | 日韩在线理论 | 国产亚洲视频在线 | 天天操天天添天天吹 | 六月久久婷婷 | 狠狠色伊人亚洲综合网站野外 | 在线看成人 | 一区二区精品在线视频 | 天天天综合网 | 国产99久久久精品视频 | 天天色天天操天天爽 | 亚洲91精品在线观看 | 97视频总站| 99草视频 | 狠狠久久 | 国产精品专区在线 | 中文字幕 第二区 | 在线观看完整版 | 亚洲综合色视频在线观看 | 日韩欧美视频免费在线观看 | 精品主播网红福利资源观看 | 久久免费99精品久久久久久 | 免费在线观看不卡av | 亚洲精品欧美精品 | 中文字幕在线免费看线人 | 天堂av在线免费观看 | 亚洲1级片 | 伊人成人精品 | 91在线超碰| 日本最新一区二区三区 | 亚洲精品激情 | 久久天堂亚洲 | www.黄色小说.com | 操操操天天操 | 欧美一级性 | 久久精品一区二区三区国产主播 | aⅴ视频在线| 国产精品日韩欧美一区二区 | 免费看国产一级片 | 日韩精品一二三 | 久久国产精品成人免费浪潮 | 亚洲国产高清在线 | 99精品国产一区二区三区麻豆 | 丁香婷婷色月天 | 69精品在线 | 国产精品久久久久久久久久ktv | 亚洲 中文 欧美 日韩vr 在线 | 久久99在线视频 | 精品在线观看一区二区 | 成人a视频片观看免费 | www黄| 午夜电影 电影 | 肉色欧美久久久久久久免费看 | 91在线日韩 | 亚洲影视九九影院在线观看 | 久艹视频免费观看 | 精品国产中文字幕 | 日日夜夜爱 | 亚洲天堂自拍视频 | 国产亚洲成人精品 | 五月天激情视频在线观看 | 欧美综合在线视频 | 久久久久久综合网天天 | 天天曰天天曰 | 国产成人久久精品亚洲 | 久久久官网| 亚洲精品乱码久久久一二三 | 天天狠狠| 亚洲欧洲精品久久 | 亚洲国产精品va在线看 | 国内精品免费久久影院 | 在线观看成年人 |