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

posts - 15,comments - 21,trackbacks - 0
很久沒有碰C++,下個項(xiàng)目要開始使用C++,所以很多東西需要撿起來重新看看。從今天起記錄一些筆記,方便自己今后查閱。言歸正傳,先從構(gòu)造函數(shù)的初始化列表說起。我把這個知識點(diǎn)細(xì)化成3個問題,1.為什么要有初始化列表,它和構(gòu)造函數(shù)中初始化有什么不一樣。2.初始化的順序。3.一些注意的細(xì)節(jié)。
      先說第一個問題。我們有兩個東西,是必須在初始化列表里完成的,一個是const修飾的變量,一個是引用。這點(diǎn)我就不細(xì)說了,查閱資料的都可以找到。下面我具體說說類成員。
class Test1
{
public:
Test1()
{
cout << "Test1 default constructor" << endl;
}
Test1(int i)
{
cout << "Test1 value constructor" << endl;
}
Test1(const Test1 &obj)
{
cout << "Test1 copy constructor" << endl;
}
Test1& operator = (const Test1 &obj)
{
cout << "Test1 = constructor" << endl;
return *this;
}
~Test1()
{
cout << "Test1 destructor" << endl;
}
};
 我定義一個類,然后再定義一個類,其中包含Test1
class Test2
{
public:
    Test2()
    {
        t1 = Test1(1);
    }

private:
    Test1 t1;
}; 
我們在構(gòu)造函數(shù)中初始化Test1,我們看看運(yùn)行結(jié)果
Test1 default constructor
Test1 value constructor
Test1 = constructor
Test1 destructor
Test1 destructor
我們分析下這個輸出。Test1 default constructor,這說明在進(jìn)入Test1構(gòu)造函數(shù)之前,已經(jīng)初始化了t1成員,并且調(diào)用的是無參構(gòu)造函數(shù)。Test1 value constructor這個是Test1(1)創(chuàng)建出來的對象。Test1 = constructor,這個表示條用了拷貝構(gòu)造函數(shù),Test1 destructor這個表示Test1(1)這個臨時對象的析構(gòu),Test1 destructor這個表示是t1這個成員對象的析構(gòu)。從上面的結(jié)果來看,構(gòu)造函數(shù)中t1 = Test1(1);其實(shí)并不是真正意義是上的初始化,而是一次拷貝賦值。當(dāng)進(jìn)入構(gòu)造函數(shù)內(nèi)部之前,類成員會被默認(rèn)構(gòu)造函數(shù)初始化。如果說Test1是個很大的對象,這塊會造成性能上的開銷。所以,這點(diǎn)也是使用初始化列表的原因之一。
      第二我們再來說下順序問題。簡單的原則是初始化列表里的會先于構(gòu)造函數(shù)中,初始化列表里會按照變量聲明的順序。我們具體看看下面的例子。
class Test3()
{
public:
    Test3(
int x,int y,int z):_z(z),_y(y)
    {
        _x 
= x;
    }

private:
    
int _x,_y,_z;
};
按照上面的說法,賦值的順序是_y,_z,_x。
      第三個是注意問題,每個成員只能在初始化列表里出現(xiàn)一次。
class Test3
{
public:
    Test3(
int x,int y,int z):_z(z),_y(y),_z(x)
    {
        _x 
= x;
    }

private:
    
int _x,_y,_z;
};
比如這種就是問題的。_z被初始化了2次。
posted @ 2012-08-14 10:24 梨樹陽光 閱讀(1488) | 評論 (3)編輯 收藏
      寫服務(wù)器的,通常會涉及到內(nèi)存池的東西,自己在這方面也看了寫了一些東西,有些體會,寫出來跟大家分享下。
      內(nèi)存池基本包含以下幾個東西,第一,初始化。第二,分配內(nèi)存。第三,回收內(nèi)存。所謂初始化,就是在服務(wù)器啟動的時候,或者第一次需要內(nèi)存的時候,系統(tǒng)分配很大的一塊內(nèi)存,方便之后的使用。分配內(nèi)存,就是從內(nèi)存池中取出需要的內(nèi)存給外部使用,當(dāng)然這里需要考慮的是當(dāng)內(nèi)存池中沒有內(nèi)存可分配時候的處理。回收內(nèi)存,簡單來說,就是外面對象生命期結(jié)束了,將分配出去的內(nèi)存回收入內(nèi)存池中。好了簡單概念就說完了,我們先來看一種最簡單的設(shè)計方式。
//為了方便描述,這里附上幾個簡單的鏈表操作宏
#define INSERT_TO_LIST( head, item, prev, next ) \
do{ \
if ( head ) \
(head)->prev = (item); \
(item)->next = (head); \
(head) = (item);          \
}while(0)
#define REMOVE_FROM_LIST(head, item, prev, next) \
do{ \
if ( (head) == (item) ) \
{ \
(head) = (item)->next; \
if ( head ) \
(head)->prev = NULL; \
} \
else \
{ \
if ( (item)->prev ) \
(item)->prev->next = (item)->next;          \
\
if ( (item)->next ) \
(item)->next->prev = (item)->prev;          \
} \
}while(0)
struct student
{
      char name[32];
      byte sex;
      
      struct student *prev,*next;
};

static struct mem_pool
{
      //該指針用來記錄空閑節(jié)點(diǎn)
      
struct student *free;
      //該變量記錄分配結(jié)點(diǎn)個數(shù)
      size_t alloc_cnt;
}s_mem_pool;

//分配內(nèi)存“塊”的函數(shù)
bool mem_pool_resize(size_t size)
{
      //該函數(shù)創(chuàng)建size個不連續(xù)的對象,把他們通過鏈表的方式加入到s_mem_pool.free中
      for ( size_t i = 0;i < size;++i )
      {
            
struct student *p = (struct student *)malloc(sizeof(struct student));
            
if ( !p )
               return false;
            
            p->prev = p->next = NULL;
            INSERT_TO_LIST(s_mem_pool.free,p,prev,next);

      }

      s_mem_pool.alloc_cnt += size;
}

#define MEM_INIT_SIZE 512  
#define MEM_INC_SIZE 256
//初始化函數(shù)
bool mem_pool_init()
{
if ( !mem_pool_resize(MEM_INIT_SIZE) )
            return false;
return true;
}
struct student *get_data()
{
if ( s_mem_pool.free == NULL )
{
            if ( !mem_pool_resize(MEM_INC_SIZE) )
                  return NULL;
}
struct student *ret = s_mem_pool.free;
REMOVE_FROM_LIST(s_mem_pool.free,ret,prev,next)
return ret;
}
void free_data(struct student *p)
{
if ( !p )
            return;
memset(p,0,sizeof(struct student));
INSERT_TO_LIST(s_mem_pool.free,p,prev,next)
}
好了最簡單的內(nèi)存池的大致框架就是這樣。我們先來看下他的過程。首先,在mem_pool_init()函數(shù)中,他先分配512個不連續(xù)的student對象。每分配出來一個就把它加入到free鏈表中,初始化完成后內(nèi)存池大概是這樣的

接下來就是從內(nèi)存池中取出一個對象get_data()。函數(shù)先去判斷是否有空閑的對象,有則直接分配,否則再向系統(tǒng)獲取一"塊"大的內(nèi)存。調(diào)用一次后的內(nèi)存池大概是這樣的

釋放對象,再把對象加入到Free鏈表中。
以上就是過程的簡單分析,下面我們來看看他的缺點(diǎn)。
第一,內(nèi)存不是連續(xù)的,容易產(chǎn)生碎片
第二,一個類型就得寫一個這樣的內(nèi)存池,很麻煩
第三,為了構(gòu)建這個內(nèi)存池,每個沒對象必須加上一個prev,next指針
好了,我們來優(yōu)化一下它。我們重新定義下我們的結(jié)構(gòu)體
union student
{
    
int index;
    
struct
    {
        
char name[32];
        
byte sex;
    }s;
};

static struct mem_pool
{
    
//該下標(biāo)用來記錄空閑節(jié)點(diǎn)
    int free;
    
//內(nèi)存池
    union student *mem;
    
//已分配結(jié)點(diǎn)個數(shù)
    size_t alloc_cnt;
}s_mem_pool;

//分配內(nèi)存塊的函數(shù)
bool mem_pool_resize(size_t size)
{
    size_t new_size 
= s_mem_pool.alloc_cnt+size;
    union student 
*tmp = (union student *)realloc(s_mem_pool.mem,new_size*sizeof(union student));
    
if ( !tmp )
        
return false;
        
    memset(tmp
+s_mem_pool.alloc_cnt,0,size*sizeof(union student));
    size_t i 
= s_mem_pool.alloc_cnt;
    
for ( ;i < new_size - 1;++i )
    {
        tmp[i].index 
= i + 1;
    }
    
    tmp[i].index 
= -1;
    s_mem_pool.free 
= s_mem_pool.alloc_cnt;
    s_mem_pool.mem 
= tmp;
    s_mem_pool.alloc_cnt 
= new_size;
    
    
return true;
}

#define MEM_INIT_SIZE    512  
#define MEM_INC_SIZE    256
//初始化函數(shù)
bool mem_pool_init()
{
    
if ( !mem_pool_resize(MEM_INIT_SIZE) )
        
return false;
        
    
return true;
}

union student 
*get_data()
{
    
if ( s_mem_pool.free == -1 )
    {
        
if ( !mem_pool_resize(MEM_INC_SIZE) )
            
return NULL;
    }
    
    union student 
*ret = s_mem_pool.mem+s_mem_pool.free;
    s_mem_pool.free 
= ret->index;
    
return ret;
}

void free_data(union student *p)
{
    
if ( !p )
        
return;
    
    p
->index = s_mem_pool.free;
    s_mem_pool.free 
= p - s_mem_pool.mem;
}
我們來看看改進(jìn)了些什么。第一student改成了聯(lián)合體,這主要是為了不占用額外的內(nèi)存,也就是我們上面所說的第三個缺點(diǎn),第二,我們使用了realloc函數(shù),這樣我們可以使我們分配出來的內(nèi)存是連續(xù)的。我們初始化的時候多了一個for循環(huán),這是為了記錄空閑對象的下標(biāo),當(dāng)我們?nèi)〕鲆粋€對象時,free可以立刻知道下一個空閑對象的位置,釋放的時候,對象先記錄free此時的值,接著再把free賦值成該對象在數(shù)組的下標(biāo),這樣就完成了回收工作。
我們繼續(xù)分析這段代碼,問題在realloc函數(shù)上,如果我們的s_mem_pool.mem已經(jīng)很大了,在realloc的時候我們都知道,先要把原來的數(shù)據(jù)做一次拷貝,所以如果數(shù)據(jù)量很大的情況下做一次拷貝,是會消耗性能的。那這里有沒有好的辦法呢,我們進(jìn)一步優(yōu)化
思路大概是這樣
初始化

再次分配的時候,我們只需要重新分配新的內(nèi)存單元,而不需要拷貝之前的內(nèi)存單元。

因此基于此思路,我們修改我們的代碼
#include <stdio.h>
#include 
<stdlib.h>

struct student
{
    
int index;

    
char name[32];
    
byte sex;
};

static struct mem_pool
{
    
//該下標(biāo)用來記錄空閑節(jié)點(diǎn)
    int free;
    
//內(nèi)存池
    struct student **mem;
    
//已分配塊個數(shù)
    size_t block_cnt;
}s_mem_pool;

#define BLOCK_SIZE        256        //每塊的大小
//分配內(nèi)存塊的函數(shù)
bool mem_pool_resize(size_t block_size)
{
    size_t new_cnt 
= s_mem_pool.block_cnt + block_size;
    
struct student **tmp = (struct student **)realloc(s_mem_pool.mem,new_size*sizeof(struct student *));
    
if ( !tmp )
        
return false;
        
    memset(tmp
+s_mem_pool.block_cnt,0,size*sizeof(struct student*));
    
for ( size_t i = s_mem_pool.block_cnt;i < new_cnt;++i )
    {
        tmp[i] 
= (struct student *)calloc(BLOCK_SIZE,sizeof(struct student));
        
if ( !tmp[i] )
            
return false;
            
        size_t j 
= 0;
        
for(;j < BLOCK_SIZE - 1;++j )
        {
            tmp[i][j].index 
= i*BLOCK_SIZE+j+1;
        }
        
        
if ( i != new_cnt-1 )
            tmp[i][j].index 
= (i+1)*BLOCK_SIZE;
        
else
            tmp[i][j].index 
= -1;
    }
    
    s_mem_pool.free 
= s_mem_pool.alloc_cnt*BLOCK_SIZE;
    s_mem_pool.mem 
= tmp;
    s_mem_pool.block_cnt 
= new_cnt;
    
    
return true;
}
 
#define MEM_INC_SIZE    10
//初始化函數(shù)
bool mem_pool_init()
{
    
if ( !mem_pool_resize(MEM_INIT_SIZE) )
        
return false;
        
    
return true;
}

struct student *get_data()
{
    
if ( s_mem_pool.free == -1 )
    {
        
if ( !mem_pool_resize(MEM_INC_SIZE) )
            
return NULL;
    }
    
    
struct student *ret = s_mem_pool.mem[s_mem_pool.free/BLOCK_SIZE]+s_mem_pool.free%BLOCK_SIZE;
    
int pos = s_mem_pool.free;
    s_mem_pool.free 
= ret->index;
    ret
->index = pos;
    
return ret;
}

void free_data(struct student *p)
{
    
if ( !p )
        
return;
    
    
int pos = p->index;
    p
->index = s_mem_pool.free;
    s_mem_pool.free 
= pos;
}
這里不一樣的地方主要在mem_pool_resize函數(shù)中,mem變成了2級指針,每次realloc的時候只需要分配指針數(shù)組的大小,無須拷貝對象,這樣可以提高效率,但是為了在釋放的時候把對象放回該放的位置,我們這里在結(jié)構(gòu)體里加入了index變量,記錄它的下標(biāo)。在內(nèi)存池里,它表示下個空閑對象的下標(biāo),在內(nèi)存池外,它表示在內(nèi)存池中的下標(biāo)。總的來說滿足了一個需求,卻又帶來了新的問題,有沒有更好的方法呢,答案是肯定,不過今天先寫到這里,明天繼續(xù)。
posted @ 2012-07-19 11:41 梨樹陽光 閱讀(3558) | 評論 (2)編輯 收藏
      昨天在看一篇文章的時候,突然想起了這個基礎(chǔ)性的問題,自己一直對它的區(qū)別不是很清楚,于是今天上午研究下了,分享下自己的理解。(對它很清楚的同學(xué)們可以略過此篇文章)
      從存儲方式來說,文件在磁盤上的存儲方式都是二進(jìn)制形式,所以,文本文件其實(shí)也應(yīng)該算二進(jìn)制文件。那么他們的區(qū)別呢,各自的優(yōu)缺點(diǎn)呢?不急,我慢慢道來。
      先從他們的區(qū)別來說,雖然都是二進(jìn)制文件,但是二進(jìn)制代表的意思不一樣。打個比方,一個人,我們可以叫他的大名,可以叫他的小名,但其實(shí)都是代表這個人。二進(jìn)制讀寫是將內(nèi)存里面的數(shù)據(jù)直接讀寫入文本中,而文本呢,則是將數(shù)據(jù)先轉(zhuǎn)換成了字符串,再寫入到文本中。下面我用個例子來說明。
我們定義了一個結(jié)構(gòu)體,表示一個學(xué)生信息,我們打算把學(xué)生的信息分別用二進(jìn)制和文本的方式寫入到文件中。
struct Student 
{
    
int num;
    
char name[20];
    
float score;
};
我們定義兩個方法,分別表示內(nèi)存寫入和文本寫入
//使用二進(jìn)制寫入
void write_to_binary_file()
{
    
struct Student stdu;
    stdu.num 
= 111;
    sprintf_s(stdu.name,
20,"%s","shine");
    stdu.score 
= 80.0f;
    fstream binary_file(
"test1.dat",ios::out|ios::binary|ios::app); //此處省略文件是否打開失敗的判斷
    binary_file.write((char *)&stdu,sizeof(struct Student));//二進(jìn)制寫入的方式
    binary_file.close();

//文本格式寫入
void write_to_text_file()
{
    
struct Student stdu;
    stdu.num 
= 111;
    sprintf_s(stdu.name,
20,"%s","shine");
    stdu.score 
= 80.0f;
    FILE 
*fp = fopen("test2.dat","a+");   //此處省略文件是否打開失敗的判斷
    fprintf(fp,"%d%s%f",stdu.num,stdu.name,stdu.score); //將數(shù)據(jù)轉(zhuǎn)換成字符串(字符串的格式可以自己定義)
    fclose(fp);

//MAIN函數(shù)調(diào)用前面兩個方法
int _tmain(int argc, _TCHAR* argv[])
{
    write_to_binary_file();
    write_to_text_file();
    
    
return 0;
}
我們來看下,文件里面的格式 2進(jìn)制文件

文本文件


2進(jìn)制文件里面將111編碼成6F,1個字節(jié),這剛好是111的16進(jìn)制表示,而文本文件中則寫成31,31,31用了3個字節(jié),表示111。73   68   69   6E   65 表示shine,之后2進(jìn)制文件里是幾個連續(xù)的FE,而文本文件中是38   30......文本文件將浮點(diǎn)數(shù)80.000000用了38(表示8)   30(表示0)  2E(表示.)   30(表示0)   30(表示0)   30(表示0)   30(表示0)   30(表示0)   30(表示0),二進(jìn)制文件用了4個字節(jié)表示浮點(diǎn)數(shù)00   00   A0   42
通過這里我們可以初見端倪了,二進(jìn)制將數(shù)據(jù)在內(nèi)存中的樣子原封不動的搬到文件中,文本格式則是將每一個數(shù)據(jù)轉(zhuǎn)換成字符寫入到文件中,他們在大小上,布局上都有著區(qū)別。由此可以看出,2進(jìn)制文件可以從讀出來直接用,但是文本文件還多一個“翻譯”的過程,因此2進(jìn)制文件的可移植性好。
posted @ 2012-07-12 09:59 梨樹陽光 閱讀(13070) | 評論 (5)編輯 收藏

先看一個簡單的使用例子

求任意個自然數(shù)的平方和:

int SqSum(int n,)   
{   
    va_list arg_ptr;   
    
int sum = 0,_n = n;   
    arg_ptr 
= va_start(arg_ptr,n);   
    
while(_n != 0)   
    {   
        sum 
+= (_n*_n);   
        _n 
= va_arg(arg_ptr,int);   
    }   
    va_end(arg_ptr);   
    
return sum;   
}
首先解釋下函數(shù)參數(shù)入棧情況 在VC等絕大多數(shù)C編譯器中,默認(rèn)情況下,參數(shù)進(jìn)棧的順序是由右向左的,因此,參數(shù)進(jìn)棧以后的內(nèi)存模型如下圖所示:
最后一個固定參數(shù)的地址位于第一個可變參數(shù)之下,并且是連續(xù)存儲的。
| 最后一個可變參數(shù)(高內(nèi)存地址處) | 第N個可變參數(shù) | 第一個可變參數(shù) | 最后一個固定參數(shù) | 第一個固定參數(shù)(低內(nèi)存地址處)
明白上面那個順序,就知道其實(shí)可變參數(shù)就是玩弄參數(shù)的地址,已達(dá)到“不定”的目的 下面我摘自VC中的源碼來解釋
va_list,va_start,va_arg,va_end宏
1.其實(shí)va_list就是我們平時經(jīng)常用的char* typedef char * va_list;
2.va_start該宏的目的就是將指針指向最后一個固定參數(shù)的后面,即第一個不定參數(shù)的起始地址 #define va_start(ap,v)( ap = (va_list)&v + _INTSIZEOF(v) ) v即表示最后一個固定參數(shù),&v表示v的地址, #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) 該宏其實(shí)是一個內(nèi)存對齊的操作。即表示大于sizeof(n)且為sizeof(int)倍數(shù)的最小整數(shù)。這句話有點(diǎn)繞,其實(shí)舉幾個例子就簡單了。比如1--4,則返回4,5--8則返回8
3.va_arg 該宏的目的是將ap指針繼續(xù)后移,讀取后面的參數(shù),t表示參數(shù)類型。該宏首先將ap指針移動到下一個參數(shù)的起始地址ap += _INTSIZEOF(t),然后將本參數(shù)的值返回 #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
4.va_end將指針賦空 #define va_end(ap) ap = (va_list)0 有了這個分析我們可以把上例中的代碼重新翻譯下
int SqSum(int n,)   
{   
    
char *arg_ptr;   
    
int sum = 0,_n = n;   
    arg_ptr 
= (char *)&+ 4;//本機(jī)上sizeof(int) = 4   
    while(_n != 0)   
    {   
        sum 
+= (_n*_n);   
        arg_ptr 
+= 4;   
        _n 
= *(int *)(arg_ptr-4);   
    }   
    arg_ptr 
= (void*)0;   
}  
這樣我們也可以寫出我們自己的printf了
posted @ 2012-07-12 09:51 梨樹陽光 閱讀(1072) | 評論 (1)編輯 收藏

1.制作自己的動態(tài)庫和靜態(tài)庫

linux下動態(tài)庫以.so結(jié)尾,靜態(tài)庫以.a結(jié)尾,它們都以lib開頭,比如一個庫名為net,那么它的全名應(yīng)該是libnet.so或者libnet.a

我們有兩個文件,hello.ctest.c,下面是兩個文件的內(nèi)容

//hello.c

#include <stdio.h>

 

void my_lib_func()

{

printf("Library routine called\r\n");

}

 

//test.c

#include <stdio.h>

 

int main()

{

my_lib_func();

 

return 1;

}

 

test.c調(diào)用了hello.c的方法,我們把hello.c封裝成庫文件。無論是靜態(tài)庫還是動態(tài)庫,都是由.o文件組成,我們先把gcc -c hello.c生成.o文件

制作靜態(tài)庫

ar crv libmyhello.a hello.o,ar是生成靜態(tài)庫的命令,libmyhello.a是我的靜態(tài)庫名。下一步就是在我的程序中使用靜態(tài)庫

可以看到已經(jīng)有了Library routine called的結(jié)果,說明調(diào)用成功了。

下面我們刪除libmyhello.a,看看程序是否還是運(yùn)行正常


我們發(fā)現(xiàn)程序依然運(yùn)行正常,說明靜態(tài)庫已經(jīng)連接進(jìn)入我們的程序中

制作動態(tài)庫


我們看見動態(tài)庫libmyhello.so已經(jīng)生成,下面繼續(xù)使用


找不到庫文件,這個時候我們把so文件拷貝到/usr/lib下面


運(yùn)行成功

 

2.動態(tài)庫和靜態(tài)庫同時存在的調(diào)用規(guī)則

我們可以發(fā)現(xiàn),不論是動態(tài)庫還是靜態(tài)庫,程序編譯連接的時候都是加的參數(shù)-l,那么當(dāng)他們同時存在的時候,程序會選擇動態(tài)庫還是靜態(tài)庫呢。我們做個嘗試。


我們同時存在libmyhello.alibmyhello.so,我們發(fā)現(xiàn)運(yùn)行的時候,出現(xiàn)找不到動態(tài)庫的錯誤,由此,我們可以得出結(jié)論,同時存在動態(tài)庫和靜態(tài)庫的時候,gcc會優(yōu)先選擇動態(tài)庫

posted @ 2012-07-11 15:15 梨樹陽光 閱讀(1521) | 評論 (0)編輯 收藏
僅列出標(biāo)題
共2頁: 1 2 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久香蕉国产日韩欧美9色| 日韩午夜精品| 久久久之久亚州精品露出| 中文久久精品| 99视频在线观看一区三区| 欧美精品激情blacked18| 久久精品盗摄| 亚洲成色777777在线观看影院| 久久午夜av| 久久婷婷国产综合精品青草| 久久精品成人| 久久夜色精品国产亚洲aⅴ| 久久国产精品99国产精| 香港成人在线视频| 久久精品av麻豆的观看方式| 一级成人国产| 亚洲午夜精品| 欧美一区激情| 久久精品视频免费播放| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲一区二区日本| 日韩一级精品视频在线观看| 亚洲精品欧美| 久久精品盗摄| 海角社区69精品视频| 欧美精品在线视频| 国产精品美女视频网站| 尤物九九久久国产精品的特点| 亚洲经典自拍| 午夜精品成人在线| 亚洲国产精品v| 亚洲女人天堂成人av在线| 毛片av中文字幕一区二区| 欧美日韩三级| 亚洲国产精品久久久久秋霞蜜臀| 亚洲午夜一二三区视频| 牛牛影视久久网| 亚洲欧美日韩国产一区二区| 欧美高清日韩| 尤妮丝一区二区裸体视频| 性欧美8khd高清极品| 亚洲人成网站777色婷婷| 久久精品观看| 国产欧美日韩一级| 亚洲综合欧美日韩| 91久久久久久久久| 女人色偷偷aa久久天堂| 黄色成人在线网站| 久久动漫亚洲| 亚洲免费在线播放| 国产精品一区毛片| 性欧美video另类hd性玩具| 一区二区三区免费在线观看| 欧美连裤袜在线视频| 亚洲精品女av网站| 亚洲国产专区校园欧美| 欧美成人一区在线| 日韩亚洲视频| 亚洲免费观看高清在线观看| 欧美男人的天堂| 亚洲丝袜av一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品高清在线| 欧美一级播放| 久久国产精品黑丝| 亚洲电影免费在线 | 久久久久久尹人网香蕉| 黄色成人小视频| 欧美成人精品不卡视频在线观看| 久久亚洲综合色一区二区三区| 一区二区在线视频播放| 欧美成人免费全部| 欧美片在线观看| 亚洲天堂网站在线观看视频| 亚洲一区二区三区在线观看视频 | 免费成人美女女| 久久五月激情| 99精品热视频只有精品10| 日韩一二三区视频| 国产精品影音先锋| 欧美成人一二三| 欧美三级中文字幕在线观看| 性色av香蕉一区二区| 久久久国产一区二区| 999亚洲国产精| 午夜精品亚洲一区二区三区嫩草| 狠狠色丁香久久婷婷综合_中| 欧美成人激情视频免费观看| 欧美日韩亚洲一区二区三区在线观看 | 亚洲精品日本| 亚洲一区二区少妇| 精品1区2区3区4区| 99这里有精品| 揄拍成人国产精品视频| 99精品久久免费看蜜臀剧情介绍| 国产精品伦子伦免费视频| 另类专区欧美制服同性| 欧美日产在线观看| 久久综合给合久久狠狠狠97色69| 欧美激情一区二区三区蜜桃视频| 欧美一区激情视频在线观看| 欧美高清视频在线观看| 欧美一区亚洲一区| 欧美日韩一级黄| 免费在线看成人av| 国产精品一区二区你懂的| 亚洲经典一区| 在线观看的日韩av| 亚洲欧美日韩专区| 亚洲素人一区二区| 欧美成人免费在线视频| 久久久亚洲欧洲日产国码αv| 欧美激情1区| 欧美www视频| 伊人一区二区三区久久精品| 亚洲一区尤物| 亚洲欧美日韩国产一区二区三区 | 久久9热精品视频| 亚洲女人天堂成人av在线| 欧美freesex8一10精品| 老色鬼精品视频在线观看播放| 国产精品久久久99| 一区二区三区精品在线| 亚洲小少妇裸体bbw| 欧美大片专区| 欧美激情精品久久久久| 在线观看日韩一区| 久久免费国产| 欧美不卡一区| 91久久精品国产91久久性色tv| 久久激情视频| 久久精品国产视频| 狠狠爱成人网| 亚洲欧洲日本专区| 亚洲欧洲一区二区在线观看| 老妇喷水一区二区三区| 毛片基地黄久久久久久天堂| 国内自拍一区| 久久色中文字幕| 欧美激情在线| 亚洲天堂av图片| 国产精品麻豆成人av电影艾秋| 亚洲婷婷国产精品电影人久久| 亚洲欧美日韩精品久久久久| 国产精品欧美激情| 欧美怡红院视频一区二区三区| 久久午夜视频| 亚洲人成高清| 国产精品国产三级国产aⅴ9色| 亚洲午夜精品一区二区| 久久久久国产精品www| 在线免费观看欧美| 欧美国产日韩一二三区| 亚洲激情电影在线| 亚洲特黄一级片| 红桃视频一区| 欧美日韩高清免费| 亚洲一区二区三区高清| 久久精品视频在线免费观看| 亚洲第一狼人社区| 欧美日韩另类视频| 欧美在线免费视屏| 亚洲日本va午夜在线影院| 亚洲欧洲99久久| 最新日韩精品| 国产精品视频一区二区三区| 久久免费视频在线| 一区二区三区国产在线观看| 久久久五月婷婷| 在线亚洲一区| 在线观看av不卡| 国产精品毛片高清在线完整版| 久久伊人精品天天| 亚洲一区二区在线| 亚洲国产一区视频| 久久久天天操| 午夜精品久久久99热福利| 亚洲人成网在线播放| 国产欧美一区二区三区沐欲| 欧美成人午夜免费视在线看片| 亚洲免费中文| 日韩视频免费观看高清在线视频| 久久久一本精品99久久精品66| 99国产精品99久久久久久粉嫩| 国产伊人精品| 国产精品美女在线观看| 欧美大片在线观看一区| 久久精品五月| 欧美一区二区福利在线| 一区二区国产日产| 91久久久久久国产精品| 美日韩在线观看| 久久狠狠亚洲综合| 亚洲欧美视频在线观看视频| 一本一本久久| 一区二区三区日韩欧美| 亚洲精品永久免费精品| 亚洲电影在线观看| 激情91久久|