亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > C > 正文

基于malloc與free函數(shù)的實(shí)現(xiàn)代碼及分析

2020-01-26 16:18:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  用于內(nèi)存管理的malloc與free這對(duì)函數(shù),對(duì)于使用C語(yǔ)言的程序員應(yīng)該很熟悉。前段時(shí)間聽(tīng)說(shuō)有的IT公司以“實(shí)現(xiàn)一個(gè)簡(jiǎn)單功能的malloc”作為面試題,正好最近在復(fù)習(xí)K&R,上面有所介紹,因此花了些時(shí)間仔細(xì)研究了一下。畢竟把題目做出來(lái)是次要的,了解實(shí)現(xiàn)思想、提升技術(shù)才是主要的。本文主要是對(duì)malloc與free實(shí)現(xiàn)思路的介紹,藍(lán)色部分文字是在個(gè)人思考中覺(jué)得比較核心的東西;另外對(duì)于代碼的說(shuō)明,有一些K&R上的解釋,使用綠色加亮。

  在研究K&R第八章第五節(jié)的實(shí)現(xiàn)之前,不妨先看看其第五章第四節(jié)的alloc/afree實(shí)現(xiàn),雖然這段代碼主要目的是展示地址運(yùn)算。

復(fù)制代碼 代碼如下:

alloc實(shí)現(xiàn)

#define ALLOCSIZE 10000
static char allocbuf[ALLOCSIZE];    /*storage for alloc*/
static char *allocp = allocbuf;    /*next free position*/

char *alloc(int n)
{
    if(allocbuf+ALLOCSIZE - allocp >= n) {
        allocp += n;
        return alloc - n;
    } else
        return 0;
}

void afree(char *p)
{
    if (p >= allocbuf && p<allocbuf + ALLOCSIZE)
        allocp = p;
}

  這種簡(jiǎn)單實(shí)現(xiàn)的缺點(diǎn)

    1.作為代表內(nèi)存資源的allocbuf,其實(shí)是預(yù)先分配好的,可能存在浪費(fèi)。

    2.分配和釋放的順序類似于棧,即“后進(jìn)先出”,釋放時(shí)如果不按順序會(huì)造成異常。

  這個(gè)實(shí)現(xiàn)雖然比較簡(jiǎn)陋,但是依然提供了一個(gè)思路。如果能把這兩個(gè)缺點(diǎn)消除,就能夠?qū)崿F(xiàn)比較理想的malloc/free。

  僅僅依靠地址運(yùn)算來(lái)進(jìn)行定位,是限制分配回收靈活性的原因,它要求已使用部分和未使用部分必須通過(guò)某個(gè)地址分開(kāi)成兩個(gè)相鄰區(qū)域。為了能讓這兩個(gè)區(qū)域能夠互相交錯(cuò),甚至其中還包括一些沒(méi)有分配的地址空間,需要使用指針把同類的內(nèi)存空間連接起來(lái)形成鏈表,這樣就可以處理地址不連續(xù)的一系列內(nèi)存空間。但是為什么只連接了空閑空間而不連接使用中的空間?這么問(wèn)可能出于在對(duì)圖中二者類比時(shí)的直覺(jué)而沒(méi)有經(jīng)過(guò)思考,這很簡(jiǎn)單,因?yàn)闆](méi)有必要。前者相互鏈接是為了能夠在內(nèi)存分配時(shí)遍歷所有空閑空間,并且在使用free()回收已使用空間時(shí)進(jìn)行重新插入。而對(duì)于使用中的空間,由于我們?cè)诜峙淇臻g時(shí)已經(jīng)知道它們的地址了,回收時(shí)可以直接告訴free(),并不用像malloc()時(shí)進(jìn)行遍歷。

  既然提到了鏈表,可能對(duì)數(shù)據(jù)結(jié)構(gòu)稍有了解的人會(huì)立刻寫(xiě)下一個(gè)struct來(lái)代表一個(gè)內(nèi)存區(qū)域,其中包含一個(gè)指向下一個(gè)內(nèi)存區(qū)域的指針,但是這個(gè)struct的其他成員該怎么寫(xiě)呢?作為待分配的內(nèi)存區(qū)域,大小是不定的,如果把它聲明為struct的成員變量顯然不妥;如果聲明為一個(gè)指向某個(gè)其他的區(qū)域的指針,這似乎又和上面的直觀表示不相符合。(當(dāng)然,這么做也是可以實(shí)現(xiàn)的,它看上去是介于上圖的兩者之間,把管理結(jié)構(gòu)和實(shí)際分配的空間相剝離,在文末我會(huì)專門(mén)的討論一下這種實(shí)現(xiàn)方法)因此,這里仍然把控制結(jié)構(gòu)和空閑空間相分開(kāi),但保持它們?cè)趦?nèi)存地址中相鄰,形成下圖的形式,而正由這個(gè)特點(diǎn),我們可以利用對(duì)控制結(jié)構(gòu)指針的指針運(yùn)算來(lái)定位對(duì)應(yīng)的內(nèi)存區(qū)域:

  

  對(duì)應(yīng)地,把控制信息定義為Header:

復(fù)制代碼 代碼如下:

typedef long Align;/*for alignment to long boundary*/
union header {
    struct {
        union header *ptr; /*next block if on free list*/
        unsigned size; /*size of this block*/
    } s;
    Align x;
};

typedef union header Header;

  使用union而不是直接使用struct的原因是為了地址對(duì)齊。這里是long對(duì)齊,union的x永遠(yuǎn)不會(huì)使用。

  這樣,malloc的主要工作就是對(duì)這些Header和其后的內(nèi)存塊的管理。

復(fù)制代碼 代碼如下:

malloc()

static Header base;
static Header *freep = NULL;

void *malloc(unsigned nbytes)
{
    Header *p, *prevp;
    unsigned nunits;
    nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1;
    if((prevp = freep) == NULL) { /* no free list */
        base.s.ptr = freep = prevp = &base;
        base.s.size = 0;
    }
    for(p = prevp->s.ptr; ;prevp = p, p= p->s.ptr) {
        if(p->s.size >= nunits) { /* big enough */
            if (p->s.size == nunits)  /* exactly */
                prevp->s.ptr = p->s.ptr;
            else {
                p->s.size -= nunits;
                p += p->s.size;
                p->s.size = nunits;
            }
            freep = prevp;
            return (void*)(p+1);
        }
        if (p== freep) /* wrapped around free list */
            if ((p = morecore(nunits)) == NULL)
                return NULL; /* none left */
    }
}


  實(shí)際分配的空間是Header大小的整數(shù)倍,并且多出一個(gè)Header大小的空間用于放置Header。但是直觀來(lái)看這并不是nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1啊?如果用(nbytes+sizeof(Header))/sizeof(Header)+1豈不是剛好?其實(shí)不是這樣,如果使用后者,nbytes+sizeof(Header)%sizeof(Header) == 0時(shí),又多分配了一個(gè)Header大小的空間了,因此還要在小括號(hào)里減去1,這時(shí)才能符合要求。

   malloc()第一次調(diào)用時(shí)建立一個(gè)退化鏈表base,只有一個(gè)大小是0的空間,并指向它自己。freep用于標(biāo)識(shí)空閑鏈表的某個(gè)元素,每次查找時(shí)可能發(fā)生變化;中間的查找和分配過(guò)程是基本的鏈表操作,在空閑鏈表中不存在合適大小的空閑空間時(shí)調(diào)用morecore()獲得更多內(nèi)存空間;最后的返回值是空閑空間的首地址,即Header之后的地址,這個(gè)接口與庫(kù)函數(shù)一致。

復(fù)制代碼 代碼如下:

morecore()

#define NALLOC 1024    /* minimum #units to request */
static Header *morecore(unsigned nu)
{
    char *cp;
    Header *up;
    if(nu < NALLOC)
        nu = NALLOC;
    cp = sbrk(nu * sizeof(Header));
    if(cp == (char *)-1)    /* no space at all*/
        return NULL;
    up = (Header *)cp;
    up->s.size = nu;
    free((void *)(up+1));
    return freep;
}


  morecore()從系統(tǒng)申請(qǐng)更多的可用空間,并加入。由于調(diào)用了sbrk(),系統(tǒng)開(kāi)銷比較大,為避免morecore()本身的調(diào)用次數(shù),設(shè)定了一個(gè)NALLOC,如果每次申請(qǐng)的空間小于NALLOC,就申請(qǐng)NALLOC大小的空間,使得后續(xù)malloc()不必每次都需要調(diào)用morecore()。對(duì)于sbrk(),在后面會(huì)有介紹。

  這里有個(gè)讓人驚訝的地方:malloc()調(diào)用了morecore(),morecore()又調(diào)用了free()!第一次看到這里時(shí)可能會(huì)覺(jué)得不可思議,因?yàn)榘凑諔T性思維,malloc()和free()似乎應(yīng)該是相互分開(kāi)的,各司其職?。康?qǐng)?jiān)偎伎家幌拢?SPAN style="COLOR: #0000ff">free()是把空閑鏈表進(jìn)行擴(kuò)充,而malloc()在空閑鏈表不足時(shí),從系統(tǒng)申請(qǐng)到更多內(nèi)存空間后,也要先把它們轉(zhuǎn)化成空閑鏈表的一部分,再進(jìn)行利用。這樣,malloc()調(diào)用free()完成后面的工作也是順理成章了。根據(jù)這個(gè)思想,后面是free()的實(shí)現(xiàn)。在此之前,還有幾個(gè)morecore()自身的細(xì)節(jié):

  1.如果系統(tǒng)也沒(méi)有空間可以分配,sbrk()返回-1。cp是char *類型,在有的機(jī)器上char無(wú)符號(hào),這里需要一次強(qiáng)制類型轉(zhuǎn)換。

  2.morecore()調(diào)用的返回值看上去比較奇怪,別擔(dān)心,freep會(huì)在free()中修改的。使用這個(gè)返回值也是為了在malloc()里的判斷、p = freep的再次賦值的語(yǔ)句能夠緊湊。

復(fù)制代碼 代碼如下:

free()

void free(void *ap)
{
    Header *bp,*p;
    bp = (Header *)ap -1; /* point to block header */
    for(p=freep;!(bp>p && bp< p->s.ptr);p=p->s.ptr)
        if(p>=p->s.ptr && (bp>p || bp<p->s.ptr))
            break;    /* freed block at start or end of arena*/
    if (bp+bp->s.size==p->s.ptr) {    /* join to upper nbr */
        bp->s.size += p->s.ptr->s.size;
        bp->s.ptr = p->s.ptr->s.ptr;
    } else
        bp->s.ptr = p->s.ptr;
    if (p+p->s.size == bp) {     /* join to lower nbr */
        p->s.size += bp->s.size;
        p->s.ptr = bp->s.ptr;
    } else
        p->s.ptr = bp;
    freep = p;
}


   free()首先定位要釋放的ap對(duì)應(yīng)的bp與空閑鏈表的相對(duì)位置,找到它的的最近的上一個(gè)和下一個(gè)空閑空間,或是當(dāng)它在整個(gè)空閑空間的前面或后面時(shí)找到空閑鏈表的首尾元素。注意,由于malloc()的分配方式和free()的回收時(shí)的合并方式(下文馬上要提到),可以保證整個(gè)空閑空間的鏈表總是從低地址逐個(gè)升高,在最高地址的空閑空間回指向低地址第一個(gè)空閑空間。

  定位后,根據(jù)要釋放的空間與附近空間的相鄰性,進(jìn)行合并,也即修改對(duì)應(yīng)空間的Header。兩個(gè)if并列可以使得bp可以同時(shí)與高地址和低地址空閑空間結(jié)合(如果都相鄰),或者進(jìn)行二者之一的合并,或者不合并。

  完成了這三部分代碼后(注意放到同一源文件中,sbrk()需要#include <unistd.h>),就可以使用了。當(dāng)然要注意,命名和stdlib.h中的同名函數(shù)是沖突的,可以自行改名。

  第一次審視源碼,會(huì)發(fā)現(xiàn)很多實(shí)現(xiàn)可能原先并沒(méi)有想到:Header的結(jié)構(gòu)和對(duì)齊填充、空間的取整、鏈表的操作和初始化(邊界情況)、malloc()對(duì)free()的調(diào)用、由malloc()和free()暗中保證的鏈表地址有序等等,確實(shí)很值得玩味。另外再附上前文中提到的兩個(gè)問(wèn)題還有一些補(bǔ)充問(wèn)題的簡(jiǎn)單思考

1.Header與空閑空間相剝離,Header中包含一個(gè)指向其空閑空間的指針

  這樣做未必不可,相應(yīng)地算法需要改動(dòng)。同時(shí),由于Header和空閑空間不再相鄰,sbrk()獲得的空間也應(yīng)該包含Header的部分,內(nèi)存的分布可能會(huì)更加瑣碎。當(dāng)然,這也可能帶來(lái)好處,即用其他數(shù)據(jù)結(jié)構(gòu)對(duì)鏈表進(jìn)行管理,比如按大小進(jìn)行hash,這樣查找起來(lái)更快。

2.關(guān)于sbrk()

  sbrk()也是庫(kù)函數(shù),它能使堆往棧的方向增長(zhǎng),具體可以參考:brk(), sbrk() 用法詳解。

3.可以改進(jìn)的方

  空閑空間的尋找是線性的,查找過(guò)程在內(nèi)存分配中可以看作是循環(huán)首次適應(yīng)算法,在某些情況下可能很慢;如果再建立一個(gè)數(shù)據(jù)結(jié)構(gòu),如hash表,對(duì)不同大小的空間進(jìn)行索引,肯定可以加快查找本身,并且能實(shí)現(xiàn)一些算法,比如最佳匹配。但查找加快的代價(jià)是,修改這個(gè)索引會(huì)占用額外的時(shí)間,這是需要權(quán)衡的。

  morecore()中的最小分配空間是宏定義,在實(shí)際使用中完全可以作為參數(shù)傳遞,根據(jù)需要設(shè)定最小分配下限。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

一区二区三区视频在线观看视频| 青青草社区在线| 在线免费观看日本一区| 日本亚洲最大的色成网站www| 久久av中文字幕片| 精品人妻中文无码av在线| 国产精品a久久久久久| 欧美精品一区二区三区视频| 一本精品一区二区三区| 艳妇臀荡乳欲伦亚洲一区| 免费欧美视频| 青青草国产精品视频| 亚洲在线黄色| 狼人精品一区二区三区在线| 综合毛片免费视频| 久香视频在线观看| 精品久久久视频| 中文字幕乱码一区二区三区| 国产精品视频一区国模私拍| www.国产精品.com| 亚洲国产精品久久人人爱| 成人免费看片视频在线观看| 美女啪啪无遮挡免费久久网站| 一级特黄大欧美久久久| 成人免费观看网站| 国产又粗又硬又长| 久久草.com| 不卡一区二区中文字幕| 日韩成人性视频| 欧美日韩激情一区二区| 91精品国产乱码久久| 91超碰rencao97精品| 亚洲一区二区三区av无码| 亚洲精品乱码久久久久| 青春草免费视频| 一区二区中文视频| 精品999在线播放| 亚洲国产毛片aaaaa无费看| www.色欧美| 亚洲激情一区| 欧洲成人av| a视频在线观看免费| 美日韩精品视频| 99精品视频在线免费播放| 国产这里只有精品| 天堂在线资源视频| 欧美一级搡bbbb搡bbbb| 涩涩网站在线看| www.先锋影音av| 1769视频在线播放免费观看| 免费黄色小视频| 17c丨国产丨精品视频| 麻豆视频在线免费看| 亚洲国产精品久久一线不卡| 亚洲国产婷婷香蕉久久久久久99| 欧美一区二区激情视频| 国产免费一区二区三区在线能观看| 欧美一区二区三区精美影视| 99在线国产| 国产婷婷一区二区三区久久| 日韩中文字幕一区二区高清99| 国产美女被下药99| 亚洲最新av网址| 亚洲少妇久久久| 一级欧美一级日韩片| 久草在线免费资源| 亚洲s色大片| 午夜久久资源| 激情综合丝袜美女一区二区| 夜夜未满十八勿进的爽爽影视| 黑人巨大精品欧美一区| 99久久国产综合精品女不卡| 黄色片网站免费在线观看| 欧美精品一区二区三区蜜桃| 国产一级性生活| 国产精品麻豆一区| av网站在线免费| 日韩一级免费视频| a欧美人片人妖| 亚洲精品久久久久久久蜜桃臀| 国产99在线播放| 91香蕉视频在线观看| 久久久久久久久久久国产精品| 国产成人高清在线| 欧美日韩网址| 三级小说一区| 92国产精品久久久久首页| 日韩在线一区二区三区免费视频| 在线视频精品一| 亚洲精品www.| 欧美色倩网站大全免费| 少妇高潮喷水在线观看| 欧美v亚洲v综合v国产v仙踪林| 欧美日韩极品在线观看一区| 日韩精品免费在线视频观看| www.亚洲资源| 国产又粗又长免费视频| 高清欧美日韩| 国产又粗又猛视频| 中文字幕日韩av资源站| av在线电影网站| 91www成人久久| 五月天精品在线| 亚洲一区精品电影| 日韩偷拍一区二区| 中文字幕亚洲色图| 欧美日韩日本网| 久久精品国产亚洲一区二区三区| 草草久久久无码国产专区| 中国动漫在线观看完整版免费| 久久网站热最新地址| 在线观看日韩中文字幕| 欧美老女人bb| www 四虎| 欧美性猛交xxx高清大费中文| 欧美视频二区欧美影视| 777777国产7777777| 精品午夜电影| 国产乱视频在线观看播放| 久久国产精品视频在线观看| 午夜影院在线观看欧美| 欧美日韩国产一区二区三区| 日韩成人手机在线| 国产视频久久久久久| 亚洲自啪免费| 国产后入清纯学生妹| 狂野欧美xxxx韩国少妇| 狠色狠色综合久久| 中文字幕精品视频在线观看| 免费在线观看麻豆视频| 欧美精品久久久久久| 国产成人高清激情视频在线观看| 成人白浆超碰人人人人| 久久成年人免费电影| 免费影院在线观看一区| 国产欧美在线观看| 性感美女一级片| 日韩一区二区三区不卡视频| 国产精品一区二区免费不卡| 国产婷婷色一区二区在线观看| 亚洲综合免费视频| 亚洲成人1区| 久久综合色之久久综合| 亚洲精品久久久久久宅男| 日韩中文字幕视频网| 欧美一级中文字幕| 亚洲天堂av资源在线观看| 久久男人天堂| 国产精品一区二区三区观看| 韩日av一区二区| 波多野结衣影片| 韩日毛片在线观看| 影音先锋日韩精品| 欧美激情办公室videoshd| 日本一区福利在线| 国产一区二区三区在线观看免费| 久久乐国产精品| 国产精品久久久久久久久借妻| 天堂精品在线视频| 国产一级二级三级在线观看| 国产精品91久久| 香蕉伊大人中文在线观看| 国产一区二区三区免费视频| 日日噜噜噜夜夜爽爽狠狠视频| 婷婷六月国产精品久久不卡| 成人精品天堂一区二区三区| 日韩福利电影在线观看| 欧美日韩在线观看不卡| 欧美五码在线| 亚洲欧洲一区二区在线观看| 黄色片中文字幕| 国产亚洲免费的视频看| 亚洲欧美在线另类| 亚洲桃花岛网站| 精品毛片免费观看| 在线看视频你懂的| 最新在线观看av| 欧美精品乱人伦久久久久久| 国产综合无码一区二区色蜜蜜| 人人草人人干| 91福利精品第一导航| 久久久精品视频网站| 91亚洲男人天堂| 久久66热这里只有精品| 欧美一区二区三区成人久久片| 99精品欧美一区| 久久视频社区| 一区二区三区麻豆| 两个人的视频www国产精品| 亚洲日本丝袜连裤袜办公室| 欧美日韩综合网| 一区二区三区偷拍| 动漫av网站免费观看| 国产污视频网站| 日韩欧美国产三级电影视频| 亚洲 欧美 日韩 综合| 在线观看的黄色网址| 欧美 日韩 激情| 欧美aaa大片视频一二区| 永久亚洲成a人片777777| 97人妻人人澡人人爽人人精品| 亚洲黄色高清| 久久国产精品毛片| 国产精品一二一区| 成人免费视频观看视频| av动漫在线免费观看| 久久久久久女乱国产| 91在线精品入口| 国产91色综合久久免费分享| 亚洲www啪成人一区二区麻豆| 一级特黄aaa大片在线观看| 午夜视频在线观看一区二区三区| 国产成人8x视频一区二区| 国产视频久久网| 你微笑时很美电视剧整集高清不卡| 中文字幕在线免费观看视频| 精品日本一区二区三区在线观看| 久久久亚洲精品一区二区三区| 精品动漫3d一区二区三区免费版| 国产黄a三级三级三级av在线看| 999亚洲国产精| 亚洲激情在线激情| 免费黄网站观看| 91.com在线观看| 国产精品国产三级国产普通话蜜臀| 日本熟妇色xxxxx日本免费看| www..com.cn蕾丝视频在线观看免费版| 肉体视频在线| 岳张嘴把我的精子吞下去| 久久99国产精品一区| 亚洲一区二区三区免费视频| 一道精品视频一区二区三区男同| 欧美午夜影院在线视频| 国产91精品久久久久久久网曝门| 日韩精选在线观看| 无码人妻黑人中文字幕| 国产精品原创视频| 这里只有精品在线播放| 成人性生交大片免费看午夜| 在线观看视频你懂的| 在线日韩国产网站| 一区二区不卡免费视频| 中文字幕麻豆| 国产999精品在线观看| 国产精品一区久久久| 欧美aa在线观看| 九九热精品免费视频| 亚洲视频一二三| 成年人网站免费在线观看| 日本免费福利视频| jizz日本免费| 无人区乱码一区二区三区| 国产麻豆精品95视频| 欧美videos另类| 国产日产亚洲精品系列| 国产成人精品三级麻豆| www.狠狠操.com| 伊人久久中文字幕| 亚洲一区二区三区在线免费观看| 综合五月激情网| 国产精品入口福利| 欧美网站大全在线观看| 久久一区二区三| jizz在亚洲| 久久久噜噜噜久久中文字幕色伊伊| 91视频免费在线| 欧美性猛交xxxx乱大交3| 亚洲最大福利视频网站| 国产性猛交xx乱| 中文字幕xxxx| 日本wwwwwwwzzzzz视频| 性欧美videohd高精| 丰满岳乱妇一区二区| 欧美精品一区二区三区三州| 五月天综合激情网| 日韩成人黄色av| 国产精品视频久久久久久久| 福利一区视频在线观看| 亚洲美女15p| 宅男网站在线免费观看| 国产精品毛片久久久久久久| 中文字幕第六页| 久久久精品久久久久| 色综合亚洲精品激情狠狠| 精品无人乱码一区二区三区的优势| 成人天堂入口网站| 69久久夜色精品国产69蝌蚪网| 99精品一区二区三区| 免费在线午夜视频| 日本人dh亚洲人ⅹxx| 国产69久久精品成人| 久草一本av| 欧美特黄一级片| 精品久久久久久久久久久久| 7777精品伊人久久久大香线蕉经典版下载| 中文字幕人妻一区二区三区视频| 国产精品久久久久久久久久| 一二三区精品福利视频| 久久久国产亚洲精品| 欧洲亚洲两性| 国产剧情av片巨作醉酒女邻居| 久久在线精品| 人妻无码一区二区三区四区| 久久精品免视着国产成人| 国产高清视频在线| 在线国产伦理一区| 免费观看成人在线| 一区二区免费在线| 国产农村妇女毛片精品久久麻豆| 一本色道久久88综合亚洲精品ⅰ| 日本韩国欧美| 91精品国产乱码久久久久久久久| 免费一区视频| 美女黄色丝袜一区| 国产 日韩 欧美 在线| 国产精品免费一区二区| 久久手机免费视频| 国产精品视频一区二区三区不卡| 亚洲天堂二区| 国产高清成人久久| 91精品视频观看| 韩国中文免费在线视频| 一区二区三区在线观看欧美| 欧美另类bbbxxxxx另类| 国产精品久久中文字幕| 久久狠狠亚洲综合| 日本中文字幕伦在线观看| 日韩成人在线免费观看|