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

我執(zhí)分別心

除了自己還有誰(shuí)

怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池

以前在一個(gè)高性能的場(chǎng)合,需要十分頻繁的使用臨時(shí)緩存。由于所需的緩存大小我事先知道,所以我索性開了一塊全局緩存,不要罵我土,它背后可以一個(gè)崇高的設(shè)計(jì)哲學(xué):奧坎姆的剃刀。
不過(guò),后邊我越看越惡心,越看越想吐,于是就想實(shí)現(xiàn)一個(gè)分配和釋放都為常數(shù)時(shí)間的MemPool. 雖然內(nèi)存池是一個(gè)老得不老再老的話題,但是我并沒有找到一個(gè)能達(dá)到我要求的設(shè)計(jì)。
雖然我對(duì)C++的任何細(xì)節(jié)都毫不知情,不過(guò)還是免為其難的寫了一個(gè)有諸多缺陷的XMemPool。

先說(shuō)下大致思路:
1 POOL將分配劃分成兩種情況,小緩存分配,大緩存分配。小于4K的我把它當(dāng)成小緩存。小緩存塊BlockSize按8字節(jié)步長(zhǎng)增長(zhǎng),大塊默認(rèn)按4K步長(zhǎng)增長(zhǎng)。每種Size的塊用兩個(gè)鏈表進(jìn)行管理(free & used)。
2 分配。要是size超過(guò)了最大能分配的大小或者池容量超過(guò)限制就直接調(diào)用系統(tǒng)分配。計(jì)算相應(yīng)塊的index(如果是調(diào)用系統(tǒng)分配的index會(huì)置為-1), 把free list第一個(gè)結(jié)點(diǎn)移到used list的第一個(gè)結(jié)點(diǎn)
3 釋放。 如果塊的index為-1直接delete。將要釋放的塊直接移動(dòng)到free list的第一個(gè)結(jié)點(diǎn)。

這樣的話缺點(diǎn)也是相當(dāng)明顯的:
1 用戶必要從Block獲取緩存
2 用戶非常有必要對(duì)緩存大小事先按需求進(jìn)行合理估計(jì)。

 1#ifndef _X_MEM_POOL_H_
 2#define _X_MEM_POOL_H_
 3
 4//! (1)alloc:O(1)
 5//! (2)free :O(1)
 6//! (3)not thread safe
 7
 8class XMemPool;
 9class XMemBlock
10{
11public:
12    XMemBlock( const int& index, const size_t& size ):
13      _index( index ),
14      _next( 0 ),
15      _pre( 0 ),
16      _size( size )
17    {
18        _data = new char[size];
19    }

20    ~XMemBlock()
21    {
22        delete []_data;
23    }

24
25public:
26    friend class XMemPool;
27    template<class T>
28    T* getMem() const return (T*)_data; }
29
30private:
31    const int    _index;
32    const size_t _size;
33    char        *_data;
34    XMemBlock  *_next;
35    XMemBlock  *_pre;
36}
;
37
38const size_t S_MEM_THRE        = 4096;//4K
39const size_t S_POOL_STEP       = 8;
40const size_t LARGE_POOL_STEP   = 4096;//4K
41const size_t SMAX_SUB_POOL_CAP = 128;
42const size_t LMAX_SUB_POOL_CAP = 64;
43
44class XMemPool
45{
46public:
47    /* 
48    maxBlockSize 此內(nèi)存池能分配的最大的內(nèi)存
49    maxSubPoolCapability 每個(gè)子內(nèi)存池的最大容量
50    poolXep 相鄰子內(nèi)存池之間的BlockSize的差距,即每個(gè)子內(nèi)存池大小為poolXep的整數(shù)倍
51
52    這里小塊的容量,大小寫死了的,只有大塊的可以配置
53    */

54    XMemPool( const size_t& maxBlockSize, const size_t& lmaxSubPoolCapability = LMAX_SUB_POOL_CAP,\
55        const size_t& lpoolXep = LARGE_POOL_STEP );
56    ~XMemPool();
57public:
58    XMemBlock *alloc( size_t size );
59    void free( XMemBlock* block );
60    void destroy();
61    size_t getTotalMemSize() const return _totalMemSize; };
62
63private:
64    const size_t _maxBlockSize;  //最大能分配的內(nèi)存塊
65    const size_t _lmaxSubPoolCapability; //每種塊的最大小數(shù)(大塊)
66    static const size_t\
67                 _smaxSubPoolCapability = SMAX_SUB_POOL_CAP;//每種塊的最大小數(shù)(小塊)
68    const size_t _lpoolXep; //大塊的增長(zhǎng)步長(zhǎng)
69    static const size_t\
70                 _spoolXep = S_POOL_STEP; //小塊的步長(zhǎng)
71    XMemBlock **_ssubPool[2];//0:free 1:used 小塊的鏈表數(shù)組
72    XMemBlock **_lsubPool[2];//大塊的鏈表數(shù)組
73    size_t       _ssubPoolNum;//小塊的種類個(gè)數(shù)
74    size_t       _lsubPoolNum;//大塊的種類個(gè)數(shù)
75    size_t      *_lsubPoolSize;//每種size大塊的個(gè)數(shù)
76    size_t      *_ssubPoolSize;//每種size小塊的個(gè)數(shù)
77    size_t       _totalMemSize;//內(nèi)存池總?cè)萘?/span>
78}
;
79
80#endif

 

  1XMemPool::XMemPool( const size_t& maxBlockSize, const size_t& lmaxSubPoolCapability, const size_t& lpoolXep ):\
  2_maxBlockSize( maxBlockSize ),
  3_lmaxSubPoolCapability( lmaxSubPoolCapability ),
  4_lpoolXep( lpoolXep )
  5{
  6    _ssubPoolNum = ( S_MEM_THRE + _spoolXep - 1 ) / _spoolXep;
  7    _lsubPoolNum = ( _maxBlockSize + _lpoolXep - 1 ) / _lpoolXep;
  8    _totalMemSize = 0;
  9    _ssubPoolSize = new size_t[_ssubPoolNum];
 10    _lsubPoolSize = new size_t[_lsubPoolNum];
 11    _ssubPool[0= new XMemBlock*[_ssubPoolNum];
 12    _ssubPool[1= new XMemBlock*[_ssubPoolNum];
 13    forint i = 0; i < _ssubPoolNum; i++ )
 14    {
 15        _ssubPool[0][i] = 0;
 16        _ssubPool[1][i] = 0;
 17        _ssubPoolSize[i] = 0;
 18    }

 19    _lsubPool[0= new XMemBlock*[_lsubPoolNum];
 20    _lsubPool[1= new XMemBlock*[_lsubPoolNum];
 21    forint i = 0; i < _lsubPoolNum; i++ )
 22    {
 23        _lsubPool[0][i] = 0;
 24        _lsubPool[1][i] = 0;
 25        _lsubPoolSize[i] = 0;
 26    }

 27}

 28
 29XMemBlock* XMemPool::alloc( size_t size ) //byte unit
 30{
 31    if( size <= S_MEM_THRE )
 32    {
 33        size_t idx = ( size + _spoolXep - 1 ) / _spoolXep - 1;
 34        XMemBlock *block = 0;
 35        if( _ssubPool[0][idx] )
 36        {
 37            block = _ssubPool[0][idx];
 38            _ssubPool[0][idx] = block->_next;
 39            if( _ssubPool[1][idx] )
 40                _ssubPool[1][idx]->_pre = block;
 41            block->_next = _ssubPool[1][idx];
 42            _ssubPool[1][idx] = block;
 43            _ssubPool[1][idx]->_pre = 0;
 44            return block;
 45        }

 46        else if( _ssubPoolSize[idx] < _smaxSubPoolCapability )
 47        {
 48            size_t msize = (idx + 1)*_spoolXep;
 49            _totalMemSize += msize;
 50            block = new XMemBlock( idx, msize );
 51            _ssubPoolSize[idx]++;
 52            if( _ssubPool[1][idx] )
 53                _ssubPool[1][idx]->_pre = block;
 54            block->_next = _ssubPool[1][idx];
 55            _ssubPool[1][idx] = block;
 56            return block;
 57        }

 58    }

 59    else if( size <= _maxBlockSize )
 60    {
 61        size_t idx = ( size + _lpoolXep - 1 ) / _lpoolXep - 1;
 62        XMemBlock *block = 0;
 63        if( _lsubPool[0][idx] )
 64        {
 65            block = _lsubPool[0][idx];
 66            _lsubPool[0][idx] = block->_next;
 67            if( _lsubPool[1][idx] )
 68                _lsubPool[1][idx]->_pre = block;
 69            block->_next = _lsubPool[1][idx];
 70            _lsubPool[1][idx] = block;
 71            _lsubPool[1][idx]->_pre = 0;
 72            return block;
 73        }

 74        else if( _lsubPoolSize[idx] < _lmaxSubPoolCapability )
 75        {
 76            size_t msize = (idx + 1)*_lpoolXep;
 77            _totalMemSize += msize;
 78            block = new XMemBlock( idx, msize );
 79            _lsubPoolSize[idx]++;
 80            if( _lsubPool[1][idx] )
 81                _lsubPool[1][idx]->_pre = block;
 82            block->_next = _lsubPool[1][idx];
 83            _lsubPool[1][idx] = block;
 84            return block;
 85        }

 86    }

 87
 88     return (new XMemBlock( -1, size ));
 89}

 90
 91void XMemPool::free( XMemBlock *block )
 92{
 93    if( block->_index < 0 )
 94    {
 95        delete block;
 96        return;
 97    }

 98    if( block->_size <= S_MEM_THRE )
 99    {
100        if( block->_next )
101            block->_next->_pre = block->_pre;
102        if( block->_pre )
103            block->_pre->_next = block->_next;
104        else if!block->_next && !block->_pre )
105            _ssubPool[1][block->_index] = 0;
106        block->_next = _ssubPool[0][block->_index];
107        if( _ssubPool[0][block->_index] )
108            _ssubPool[0][block->_index]->_pre = block;
109        _ssubPool[0][block->_index] = block;
110    }

111    else
112    {
113        if( block->_next )
114            block->_next->_pre = block->_pre;
115        if( block->_pre )
116            block->_pre->_next = block->_next;
117        else if!block->_next && !block->_pre )
118            _lsubPool[1][block->_index] = 0;
119        block->_next = _lsubPool[0][block->_index];
120        if( _lsubPool[0][block->_index] )
121            _lsubPool[0][block->_index]->_pre = block;
122        _lsubPool[0][block->_index] = block;
123    }

124}

125
126void XMemPool::destroy()
127{
128    forint i = 0; i < _ssubPoolNum; i++ )
129    {
130        XMemBlock *block = _ssubPool[0][i], *tmp;
131        while( block )
132        {
133            tmp = block->_next;
134            delete block;
135            block = tmp;
136        }

137        _ssubPool[0][i] = 0;
138
139        block = _ssubPool[1][i];
140        while( block )
141        {
142            tmp = block->_next;
143            delete block;
144            block = tmp;
145        }

146        _ssubPool[1][i] = 0;
147        _ssubPoolSize[i] = 0;
148    }

149    forint i = 0; i < _lsubPoolNum; i++ )
150    {
151        XMemBlock *block = _lsubPool[0][i], *tmp;
152        while( block )
153        {
154            tmp = block->_next;
155            delete block;
156            block = tmp;
157        }

158        _lsubPool[0][i] = 0;
159
160        block = _lsubPool[1][i];
161        while( block )
162        {
163            tmp = block->_next;
164            delete block;
165            block = tmp;
166        }

167        _lsubPool[1][i] = 0;
168        _lsubPoolSize[i] = 0;
169    }

170}

171
172XMemPool::~XMemPool()
173{
174    destroy();
175    delete []_ssubPoolSize;
176    delete []_lsubPoolSize;
177    delete []_ssubPool[0];
178    delete []_ssubPool[1];
179    delete []_lsubPool[0];
180    delete []_lsubPool[1];
181}

 

1XMemPool samplePool(4096);
2XMemBlock *sampleBlock = samplePool.alloc(sizeof(int)*100);
3int *sampleData = sampleBlock->getMem<int>();
4samplePool.free(sampleBlock);



很多細(xì)節(jié)還沒考慮到,誰(shuí)能為我推薦一個(gè)好的設(shè)計(jì)方案?雙O(1)的

posted on 2012-03-16 14:32 我執(zhí)分別心 閱讀(1549) 評(píng)論(11)  編輯 收藏 引用

評(píng)論

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池[未登錄] 2012-03-16 16:54 hdqqq

在alloc和free中看到了new和delete,這種分配不會(huì)是o(1)的。  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-16 17:00 我執(zhí)分別心

@hdqqq
沒有認(rèn)真看代碼吧, 只是內(nèi)存池滿了OR請(qǐng)求大小超過(guò)上限才會(huì)new delete
當(dāng)然內(nèi)存池沒有預(yù)分配,是逐步增長(zhǎng)的  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-16 18:53 陳梓瀚(vczh)

我以前也做過(guò)類似的。首先一個(gè)好的小尺寸緩存池可以O(shè)(1)new和delete這個(gè)顯然你已經(jīng)知道怎么做了,然后準(zhǔn)備8 16 32 64各種尺寸,最后用平衡樹組織起來(lái)。雖然這嚴(yán)格來(lái)算不是O(1),但是經(jīng)驗(yàn)下他是O(1)的——只要你不要讓節(jié)點(diǎn)有幾十個(gè)那么多。至于大尺寸的,是沒辦法的。  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-16 19:06 我執(zhí)分別心

@陳梓瀚(vczh)
我實(shí)現(xiàn)的這個(gè)雖然有缺陷,但在我的使用范圍內(nèi),確實(shí)是嚴(yán)格O(1)的。如果要用到HASH或樹之類的就是lg(n)的了。 SIZE按冪次增長(zhǎng)我也想過(guò),那樣的話空間浪費(fèi)厲害,不過(guò)跨度比較大的話確實(shí)可以考慮  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-16 19:11 陳梓瀚(vczh)

@我執(zhí)分別心
不定尺寸池嚴(yán)格O(1)是不可能的,我不知道我有沒有理解錯(cuò)你的意思,反正大概就是這個(gè)意思了,如果你要對(duì)付那些頻繁new和delete的場(chǎng)景的話。  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-16 19:24 我執(zhí)分別心

@陳梓瀚(vczh)
為什么不可能呢? 我這兒的實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,關(guān)鍵是用block里面的index,它的本質(zhì)是一個(gè)O(1)的HASH, 這樣的代價(jià)就是創(chuàng)建pool的時(shí)候: 非常有必要對(duì)緩存大小事先按需求進(jìn)行合理估計(jì)。  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-16 21:09 yrj

http://git.savannah.gnu.org/cgit/lwip.git/tree/src/core/memp.c  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-17 03:53 陳梓瀚(vczh)

@我執(zhí)分別心
不要以為hash就真的是O(1)的,還記得之前很多語(yǔ)言的hashtable被用來(lái)做DDOS的事情嗎?  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-17 09:25 我執(zhí)分別心

@陳梓瀚(vczh)
size_t idx = ( size + _lpoolXep - 1 ) / _lpoolXep - 1; 它是O(1)不?  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池 2012-03-17 09:29 tb

厲害  回復(fù)  更多評(píng)論   

# re: 怎么實(shí)現(xiàn)釋放和分配時(shí)間復(fù)雜度都為常數(shù)(O(1))的內(nèi)存池[未登錄] 2012-03-19 08:54 Chipset

小的容易做到,boundary tags, bitmap, freelist都行,大的需要比較復(fù)雜的數(shù)據(jù)結(jié)構(gòu),建議用PTrie,你可以參考下DLMalloc,谷歌下。

如果多處理器并行環(huán)境,那就非常困難了,傳統(tǒng)的并發(fā)控制機(jī)制會(huì)成為瓶頸,還要小心False sharing, blowup...,你可以參考下JeMalloc,谷歌下。  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


導(dǎo)航

<2012年3月>
26272829123
45678910
11121314151617
18192021222324
25262728293031
1234567

統(tǒng)計(jì)

常用鏈接

留言簿

隨筆檔案

文章分類

最新隨筆

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲电影免费观看高清| 欧美日韩国产影片| 国产精品久久久久久av福利软件| 亚洲国产一区在线| 久久精品在线| 亚洲国产欧美一区二区三区同亚洲 | 国产精品久久久久aaaa樱花| 国产精品乱码妇女bbbb| 久久久一区二区三区| 亚洲精品一区二区网址| 欧美一区二区在线免费播放| 激情亚洲成人| 国产精品久久综合| 国产乱理伦片在线观看夜一区 | 欧美国产一区二区三区激情无套| 欧美一区国产二区| 国产精品高清一区二区三区| 欧美日韩一区不卡| 午夜精品一区二区三区在线播放| 欧美风情在线观看| 亚洲欧美一区二区原创| 好看不卡的中文字幕| 国产精品v一区二区三区| 久久久91精品国产一区二区精品| 老司机精品视频网站| 久久精品成人欧美大片古装| 在线性视频日韩欧美| 女主播福利一区| 欧美一区二区视频在线观看2020| 老鸭窝毛片一区二区三区| 欧美在线影院在线视频| 欧美一区二区性| 亚洲区在线播放| 亚洲高清av在线| 亚洲经典自拍| **欧美日韩vr在线| 一区二区免费在线观看| 在线观看av一区| 一区二区三区无毛| 宅男66日本亚洲欧美视频| 欧美a级一区二区| 欧美亚洲在线播放| 久久国产66| 国产精品久久久久久久免费软件 | 亚洲韩国精品一区| 亚洲国产欧美一区二区三区同亚洲 | 亚洲日本在线观看| 在线欧美福利| 欧美在线高清视频| 亚洲美女在线观看| 亚洲小说欧美另类社区| 亚洲视频一区二区| 欧美日本高清| 国产精品午夜在线观看| 国产美女一区| 亚洲性夜色噜噜噜7777| 午夜精品在线看| 日韩一二在线观看| 欧美精品在线观看91| 亚洲精一区二区三区| 亚洲影院高清在线| 久久精品免费播放| 欧美大尺度在线| 久久国产精品一区二区三区四区| 国产欧美 在线欧美| 一区二区在线视频观看| 久久五月激情| 亚洲毛片在线观看.| 欧美国产亚洲精品久久久8v| 一区二区精品在线| 在线中文字幕日韩| 国产精品久久久久久久久免费桃花| 亚洲字幕在线观看| 亚洲欧美日韩精品一区二区| 久久gogo国模啪啪人体图| 巨乳诱惑日韩免费av| 亚洲第一在线综合网站| 欧美黄色视屏| 久久丁香综合五月国产三级网站| 国产精品亚洲综合一区在线观看| 欧美在线播放一区二区| 久久久99爱| 一区二区久久久久久| 亚洲欧美日韩国产综合精品二区| 国语对白精品一区二区| 亚洲电影在线免费观看| 欧美三级日本三级少妇99| 亚洲日本欧美| 亚洲免费福利视频| 亚洲永久精品国产| 欧美va天堂| 在线看视频不卡| 亚洲国产成人不卡| 国产精品成人播放| 乱中年女人伦av一区二区| 欧美激情综合色综合啪啪| 精品1区2区3区4区| 亚洲欧洲精品一区二区三区不卡| 国产精品免费电影| 欧美xx视频| 国产精品夜夜夜| 亚洲日本乱码在线观看| 国产一区二区三区奇米久涩| 久久爱另类一区二区小说| 狂野欧美性猛交xxxx巴西| 亚洲一二三级电影| 免费不卡在线观看| 欲色影视综合吧| 一本色道久久综合亚洲精品婷婷 | 亚洲人午夜精品| 蜜臀av一级做a爰片久久| 午夜视频一区二区| 亚洲美女av网站| 久久婷婷综合激情| 亚洲缚视频在线观看| 免费欧美日韩| 国产区精品视频| aⅴ色国产欧美| 国产日韩一区二区三区在线播放| 性欧美超级视频| 亚洲永久免费视频| 亚洲精品在线观看免费| 久久久精品久久久久| 欧美亚洲一区二区在线| 欧美日韩另类国产亚洲欧美一级| 欧美成年人视频网站| 好看的av在线不卡观看| 欧美一区二区视频免费观看| 亚洲欧美日韩另类| 久久九九国产精品| 香蕉视频成人在线观看| 国产精品v日韩精品v欧美精品网站 | 亚洲欧美日韩国产成人| 欧美精品v日韩精品v韩国精品v| 免费久久99精品国产自在现线| 国产在线乱码一区二区三区| 欧美第十八页| 在线欧美电影| 你懂的亚洲视频| 亚洲欧洲日本专区| 亚洲免费高清| 欧美涩涩视频| 亚洲永久在线观看| 久久午夜视频| 亚洲国产小视频| 欧美另类变人与禽xxxxx| 亚洲免费观看高清在线观看 | 亚洲国产精品电影| 久久一区中文字幕| 欧美激情91| 国产精品99久久99久久久二8 | 免费国产一区二区| 91久久国产精品91久久性色| 在线一区视频| 国产欧美一区二区精品忘忧草| 午夜视黄欧洲亚洲| 免费欧美电影| 亚洲主播在线播放| 国产一区二区精品| 欧美寡妇偷汉性猛交| 亚洲视频播放| 蜜臀va亚洲va欧美va天堂| 亚洲欧洲日本专区| 欧美视频在线观看免费网址| 欧美夜福利tv在线| 亚洲国产精品欧美一二99| 亚洲永久视频| 精品999成人| 欧美午夜免费影院| 欧美在线免费| 亚洲精选久久| 麻豆成人在线| 午夜精品视频在线观看| 亚洲国产合集| 国产日韩欧美一二三区| 欧美激情久久久| 性欧美video另类hd性玩具| 鲁大师影院一区二区三区| 亚洲一区二区av电影| 黄网动漫久久久| 国产精品美女一区二区在线观看| 美女在线一区二区| 午夜精品一区二区三区在线视| 亚洲激情在线| 免费亚洲一区二区| 欧美一级大片在线免费观看| 日韩亚洲欧美在线观看| 免费av成人在线| 新67194成人永久网站| 亚洲三级视频| 欧美国产在线观看| 久久久777| 激情亚洲网站| 国产精品久久二区二区| 欧美成人午夜激情在线| 亚洲国产天堂久久国产91| 欧美一区2区三区4区公司二百| 亚洲精选在线观看| 亚洲国产精品成人va在线观看| 国产丝袜一区二区|