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

Where there is a dream ,there is hope

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  64 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

#

 

都是內存對齊,稍有區別,這里測試平臺是VS2008,其它平臺為測試

#pragma pack( n ),
結構體中的數據成員,除了第一個是始終放在最開始的地方,其它數據成員的地址必須是它本身大小或對齊參數兩者中較小的一個的倍數
 即:min(n, sizeof(elem))

結構體整個的大小就沒有另外的要求

 

#pragma pack(1)
struct TestA
{
    
char  a;
    
short b;
    
char  c;
}
;

#pragma pack(
4)
struct TestB
{
    
char  a;
    
short b;
    
char  c;
}
;


結果:


在結構體中含有結構體的話,內結構體的大小按照此結構體內最大元素的大小來計算,各個元素的計算方法如下:
min(n, e ||max({e}) )

#pragma pack( 4 )
struct TestA
{
    
char  a;
    
short b;
    
char  c;
}
;

#pragma pack( 
8 )
struct TestB
{
    
char  a;
    
char  c;
    TestA m_a;
}
;

因為TestA最大的元素是short 2B,所以計算TestA的大小的時候,按照2來算



__declspec( align(#) )#pragma pack( n )同時修飾結構體的時候,前者的優先級高,
注意前者與后者的區別:

成員的地址決定于前者及后者,其要么是前者的倍數,要么是后者的倍數,要么是成員的大小的倍數,取最小。

結構體最后的大小于前者有關,其要么是前者的倍數,要么是結構體中最大偏移量的倍數,取最大。

要算出最后結果,必須知道兩者的值或缺省值

__declspec(align(1)) struct TestA
{
    
char  a;
    
short b;
    
char  c;
    
double d;
}
;

__declspec(align(
32)) struct TestB
{
    
char  a;
    
short b;
    
char  c;
    
double d;
}
;

輸出:

posted @ 2011-03-14 12:21 IT菜鳥 閱讀(386) | 評論 (0)編輯 收藏

     摘要: 溫故而知新,總結了多種單例模式的寫法,考慮上多線程沒有非常完美的,各取所需吧 //1.//Easy ,<<Pattern Design>>//Q://When to free the m_singleton space?//when to execute the ...  閱讀全文
posted @ 2011-03-09 16:18 IT菜鳥 閱讀(338) | 評論 (0)編輯 收藏

總用到這個轉化,記下來
wchar_t* atow(char* src)
{
    
int dest_len;
    dest_len 
= MultiByteToWideChar(CP_ACP,0,src,-1,NULL,0);
    wchar_t 
*dest = new wchar_t[dest_len];
    
if(dest == NULL)
        
return NULL;
    MultiByteToWideChar(CP_ACP,
0,src,-1,dest,dest_len);
    
return dest;
}
posted @ 2011-02-28 12:05 IT菜鳥 閱讀(414) | 評論 (0)編輯 收藏

static關鍵字在C和C++中的用法稍有區別,主要是C++擴展了static關鍵字的作用
C 用法
1.修飾函數成員變量:例

//test.h
void test_static_var();

//test.c
void test_static_var()
{
    
static int var=0;//!不初始化默認為0
    var++;
    printf(
"static int var : %d \n", var);
}


//main.c
int main()
{
    
for (int i=0; i<10; i++)
    
{
        test_static_var();
    }

    getchar();
    
return 0;
}

2.在文件級別(即:在函數體外)修飾 變量或者函數,則表示該變量只在該文件中可見及可用
//test.h
void test_static_funtion_one();
void test_static_fuction_two();

//test.c
void test_static_funtion_one()
{
    printf(
"This is a normal function. \n");
}

static
void test_static_fuction_two()
{
    printf(
"This is a function modified by static. \n");
}


//main.c

int main()
{
    test_static_funtion_one();
    test_static_fuction_two();
    getchar();
    
return 0;
}

這樣就會報錯:LNK2001: 無法解析的外部符號 "void __cdecl test_static_fuction_two(void)" (?test_static_fuction_two@@YAXXZ)
原因就是test_static_fuction_two()被修飾為static ,如果main中不調用的話,編譯可以通過(VS08),否則便以失敗
修飾為static后,它只能在test.c中使用。

C++中包含了前兩種方法,又擴展了下面兩種方法:
3.修飾class 數據成員,稱為 靜態數據成員
4.修飾class 函數成員,稱之為 靜態成員函數
//test.h
     class TestA
     
{
     
public:
         
         
static int s_count;
         
static int getCount();
     
public:
         
int m_value;
     }
;

//test.c
    int TestA::s_count=0;
    
int TestA::getCount()
    
{
        
//m_value+=m_value; 靜態函數中只能操作靜態數據成員
        return s_count;
    }
因為靜態成員函數沒有傳入隱式的this指針,所以,它不能使用. 、->操作符 ;不能是virtual 的,不能和非靜態的同名
posted @ 2011-02-16 12:21 IT菜鳥 閱讀(217) | 評論 (0)編輯 收藏

當定義一個命名空間時,可以忽略這個命名空間的名稱:

     namespce {
         char c;
         int i;
         double d;
     }
     編譯器在內部會為這個命名空間生成一個唯一的名字,而且還會為這個匿名的命名空間生成一條using指令。所以上面的代碼在效果上等同于:
     namespace __UNIQUE_NAME_ {
         char c;
         int i;
         double d;
     }
     using namespace __UNIQUE_NAME_;
 
     在匿名命名空間中聲明的名稱也將被編譯器轉換,與編譯器為這個匿名命名空間生成的唯一內部名稱(即這里的__UNIQUE_NAME_)綁定在一起。還有一點很重要,就是這些名稱具有internal鏈接屬性,這和聲明為static的全局名稱的鏈接屬性是相同的,即名稱的作用域被限制在當前文件中,無法通過在另外的文件中使用extern聲明來進行鏈接。如果不提倡使用全局static聲明一個名稱擁有internal鏈接屬性,則匿名命名空間可以作為一種更好的達到相同效果的方法。
注意:命名空間都是具有external 連接屬性的,只是匿名的命名空間產生的__UNIQUE_NAME__在別的文件中無法得到,這個唯一的名字是不可見的.
C++ 新的標準中提倡使用匿名命名空間,而不推薦使用static,因為static用在不同的地方,涵義不同,容易造成混淆.另外,static不能修飾class
posted @ 2011-02-16 10:12 IT菜鳥 閱讀(702) | 評論 (2)編輯 收藏

原文地址:http://www.cnblogs.com/ly4cn/archive/2005/11/28/286185.html

    指針,在C/C++語言中一直是很受寵的;幾乎找不到一個不使用指針的C/C++應用。用于存儲數據和程序的地址,這是指針的基本功能。用于指向整型數,用整數指針(int*);指向浮點數用浮點數指針(float*);指向結構,用對應的結構指針(struct xxx *);指向任意地址,用無類型指針(void*)。
    有時候,我們需要一些通用的指針。在C語言當中,(void*) 可以代表一切;但是在C++中,我們還有一些比較特殊的指針,無法用(void*)來表示。事實上,在C++中,想找到一個通用的指針,特別是通用的函數指針簡直是一個“不可能任務”。
   
    C++是一種靜態類型的語言,類型安全在C++中舉足輕重。在C語言中,你可以用void*來指向一切;但在C++中,void*并不能指向一切,就算能,也失去了類型安全的意義了。類型安全往往能幫我們找出程序中潛在的一些BUG。
   
    下面我們來探討一下,C++中如何存儲各種類型數據的指針。

   
    1.  數據指針
     數據指針分為兩種:常規數據指針和成員數據指針
     
    1.1 常規數據指針
     這個不用說明了,和C語言一樣,定義、賦值是很簡單明了的。常見的有:int*, double* 等等。
     如:
     int value = 123;
     
int * pn = &value;
   
     
    1.2 成員數據指針
     有如下的結構:
     struct MyStruct
     {
       
int key;
       
int value;
     };
   
     現在有一個結構對象:
     MyStruct me;
     MyStruct* pMe = &me;
   
     我們需要 value 成員的地址,我們可以:
     int * pValue = &me.value;
     //
     int * pValue = &pMe->value;
   
     當然了,這個指針仍然是屬于第一種范籌----常規數據指針。
     
     好了,我們現在需要一種指針,它指向MyStruct中的任一數據成員,那么它應該是這樣的子:
     int MyStruct::* pMV = &MyStruct::value;
     
//
     int MyStruct::* pMK = &MyStruct::key;
   
     這種指針的用途是用于取得結構成員在結構內的地址。我們可以通過該指針來訪問成員數據:
     int value = pMe->*pMV; // 取得pMe的value成員數據。
     int key = me.*pMK; // 取得me的key成員數據。
   
     那么,在什么場合下會使用到成員數據指針呢?
     確實,成員指針本來就不是一種很常用的指針。不過,在某些時候還是很有用處的。我們先來看看下面的一個函數:
  int sum(MyStruct* objs, int MyStruct::* pm, int count)
  {
      
int result = 0;
      
for(int i = 0; i < count; ++i)
          result 
+= objs[i].*pm;
      
return result;
  }
     
     這個函數的功能是什么,你能看明白嗎?它的功能就是,給定count個MyStruct結構的指針,計算出給定成員數據的總和。有點拗口對吧?看看下面的程序,你也許就明白了:
     
     MyStruct me[10=
     {
      {
1,2},{3,4},{5,6},{7,8},{9,10},{11,12},{13,14},{15,16},{17,18},{19,20}
     };
     
     
int sum_value = sum(me, &MyStruct::value, 10);
     
//計算10個MyStruct結構的value成員的總和: sum_value 值 為 110     (2+4+6+8++20)
     
     
int sum_key = sum(me, &MyStruct::key, 10);
     
//計算10個MyStruct結構的key成員的總和:   sum_key 值 為 100       (1+3+5+7++19)
   
     
     也許,你覺得用常規指針也可以做到,而且更易懂。Ok,沒問題:
     int sum(MyStruct* objs, int count)
     {
      
int result = 0;
      
for(int i = 0; i < count; ++i)
       result 
+= objs[i].value;
      
return result;
     }

     你是想這么做嗎?但這么做,你只能計算value,如果要算key的話,你要多寫一個函數。有多少個成員需要計算的話,你就要寫多少個函數,多麻煩啊。 
posted @ 2011-02-15 11:19 IT菜鳥 閱讀(368) | 評論 (1)編輯 收藏


對于拷貝構造函數引用傳遞,似乎司空見慣,認為理所當然。但是被問起這個問題,的確是一片茫然,為什么呢?

去網上搜索了一下,的確有很多這方面的知識講解。

我們先看一下CSDN上的一個帖子的回答:
簡單的回答是為了防止遞歸引用。
具體一些可以這么講:
 當一個對象需要以值方式傳遞時,編譯器會生成代碼調用它的拷貝構造函數以生成一個復本。如果類A的拷貝構造函數是以值方式傳遞一個類A對象作為參數的話,當需要調用類A的拷貝構造函數時,需要以值方式傳進一個A的對象作為實參; 而以值方式傳遞需要調用類A的拷貝構造函數;結果就是調用類A的拷貝構造函數導致又一次調用類A的拷貝構造函數,這就是一個無限遞歸。

這個解釋還是蠻具體的。
利用值傳遞的話,會導致遞歸引用。

還有一片文章也談到了這個問題, 我覺得寫得也非常好!

為什么拷貝構造函數必須為引用傳遞,不能是值傳遞?
鏈接地址:http://www.cnblogs.com/chio/archive/2007/09/14/893299.html

其中講到了3個問題
1是拷貝構造函數的作用。
      作用就是用來復制對象的,在使用這個對象的實例來初始化這個對象的一個新的實例。
2是參數傳遞過程到底發生了什么?
      將地址傳遞和值傳遞統一起來,歸根結底還是傳遞的是"值"(地址也是值,只不過通過它可以找到另一個值)!
i)值傳遞:
    對于內置數據類型的傳遞時,直接賦值拷貝給形參(注意形參是函數內局部變量);
    對于類類型的傳遞時,需要首先調用該類的拷貝構造函數來初始化形參(局部對象);如void foo(class_type obj_local){}, 如果調用foo(obj);  首先class_type obj_local(obj) ,這樣就定義了局部變量obj_local供函數內部使用
ii)引用傳遞:
    無論對內置類型還是類類型,傳遞引用或指針最終都是傳遞的地址值!而地址總是指針類型(屬于簡單類型), 顯然參數傳遞時,按簡單類型的賦值拷貝,而不會有拷貝構造函數的調用(對于類類型).
3是在類中有指針數據成員時,拷貝構造函數的使用?
        如果不顯式聲明拷貝構造函數的時候,編譯器也會生成一個默認的拷貝構造函數,而且在一般的情況下運行的也很好。但是在遇到類有指針數據成員時就出現問題了:因為默認的拷貝構造函數是按成員拷貝構造,這導致了兩個不同的指針(如ptr1=ptr2)指向了相同的內存。當一個實例銷毀時,調用析構函數free(ptr1)釋放了這段內存,那么剩下的一個實例的指針ptr2就無效了,在被銷毀的時候free(ptr2)就會出現錯誤了, 這相當于重復釋放一塊內存兩次。這種情況必須顯式聲明并實現自己的拷貝構造函數,來為新的實例的指針分配新的內存。

問題1和2回答了為什么拷貝構造函數使用值傳遞會產生無限遞歸調用的問題;
問題3回答了回答了在類中有指針數據成員時,拷貝構造函數使用值傳遞等于白顯式定義了拷貝構造函數,因為默認的拷貝構造函數就是這么干的
posted @ 2011-02-14 17:50 IT菜鳥 閱讀(790) | 評論 (0)編輯 收藏

(轉自:http://grantren.javaeye.com/blog/43289)

一 拷貝構造函數是C++最基礎的概念之一,大家自認為對拷貝構造函數了解么?請大家先回答一下三個問題:

1. 以下函數哪個是拷貝構造函數,為什么?

  1. X::X(const X&);   
  2. X::X(X);   
  3. X::X(X&, int a=1);   
  4. X::X(X&, int a=1, b=2);  

 2. 一個類中可以存在多于一個的拷貝構造函數嗎?

3. 寫出以下程序段的輸出結果, 并說明為什么? 如果你都能回答無誤的話,那么你已經對拷貝構造函數有了相當的了解。

  1. #include    
  2. #include    
  3.   
  4. struct X {   
  5.   template<typename T>   
  6.   X( T& ) { std::cout << "This is ctor." << std::endl; }   
  7.   
  8.   template<typename T>   
  9.     X& operator=( T& ) { std::cout << "This is ctor." << std::endl; }   
  10. };   
  11.   
  12. void main() {   
  13.   X a(5);   
  14.   X b(10.5);   
  15.   X c = a;   
  16.   c = b;   
  17. }  

 

解答如下:

1. 對于一個類X,如果一個構造函數的第一個參數是下列之一:
a) X&
b) const X&
c) volatile X&
d) const volatile X&
且沒有其他參數或其他參數都有默認值,那么這個函數是拷貝構造函數. 

  1. X::X(const X&);  //是拷貝構造函數   
  2. X::X(X&, int=1); //是拷貝構造函數  

 2.類中可以存在超過一個拷貝構造函數, 

  1. class X {      
  2. public:      
  3.   X(const X&);      
  4.   X(X&);            // OK   
  5. };  

注意,如果一個類中只存在一個參數為X&的拷貝構造函數,那么就不能使用const X或volatile X的對象實行拷貝初始化.

  1. class X {   
  2. public:   
  3.   X();   
  4.   X(X&);   
  5. };   
  6.     
  7. const X cx;   
  8. X x = cx;    // error   

如果一個類中沒有定義拷貝構造函數,那么編譯器會自動產生一個默認的拷貝構造函數.
這個默認的參數可能為X::X(const X&)或X::X(X&),由編譯器根據上下文決定選擇哪一個.

默認拷貝構造函數的行為如下:
 默認的拷貝構造函數執行的順序與其他用戶定義的構造函數相同,執行先父類后子類的構造.
 拷貝構造函數對類中每一個數據成員執行成員拷貝(memberwise Copy)的動作.
 a)如果數據成員為某一個類的實例,那么調用此類的拷貝構造函數.
 b)如果數據成員是一個數組,對數組的每一個執行按位拷貝.
 c)如果數據成員是一個數量,如int,double,那么調用系統內建的賦值運算符對其進行賦值.

 

3.  拷貝構造函數不能由成員函數模版生成. 

  1. struct X {   
  2.     template<typename T>   
  3.     X( const T& );    // NOT copy ctor, T can't be X   
  4.   
  5.     template<typename T>   
  6.     operator=( const T& );  // NOT copy ass't, T can't be X   
  7. };   
  8.   

原因很簡單, 成員函數模版并不改變語言的規則,而語言的規則說,如果程序需要一個拷貝構造函數而你沒有聲明它,那么編譯器會為你自動生成一個. 所以成員函數模版并不會阻止編譯器生成拷貝構造函數, 賦值運算符重載也遵循同樣的規則.(參見Effective C++ 3edition, Item45)


二 針對上面作者的討論,理解更深了,但是下面我還是會給出一個一般的標準的實現和注意事項:
#include "stdafx.h"
#include 
"stdio.h"
#include 
<iostream>
#include 
<string>


struct Test1 
{
    Test1() 
{ }
    Test1(
int i) { id = i; }
    Test1(
const Test1& test)
    
{
        id 
= test.id;
    }

    Test1
& operator = (const Test1& test)
    
{
        
if(this == &test)
            
return *this;
        id 
= test.id;
        
return *this;
    }

    
int id;
}
;

class Test2
{
public:
    Test2()
{ m_pChar = NULL;}
    Test2(
char *pChar) { m_pChar = pChar;}
    Test2(
int num) 
    

        m_pChar 
= new char[num];
        
for(int i = 0; i< num; ++i)
            m_pChar[i] 
= 'a';
        m_pChar[num
-1= '\0';
    }

    Test2(
const Test2& test)
    
{
        
char *pCharT = m_pChar;

        m_pChar 
= new char[strlen(test.m_pChar)];
        strcpy(m_pChar, test.m_pChar);

        
if(!pCharT)
            delete []pCharT;
    }

    Test2
& operator = (const Test2& test)
    
{
        
if(this == &test)
            
return *this;

        
char *pCharT = m_pChar;
        m_pChar 
= new char[strlen(test.m_pChar)];
        strcpy(m_pChar, test.m_pChar);

        
if(!pCharT)
            delete []pCharT;

        
return *this;
    }

private:
    
char *m_pChar;
}
;

int main(int argc, char* argv[])
{
    
const Test1 ts(1); // Test1()
    const Test1* p_ts = &ts;
    
const Test1 ts2(ts); //Test(const Test1& test)
    const Test1 ts3 = ts; //Test(const Test1& test)
    Test1 ts4; ts4 = ts;  //Test1& operator = (const Test1& test)

    Test2 t(
5);
    Test2 t2(t);
    Test2 t3 
= t2;
    Test2 t4; t4 
= t;
    
return 0;
}

posted @ 2011-02-14 17:38 IT菜鳥 閱讀(323) | 評論 (0)編輯 收藏

看到一個簡潔的字符串連接函數,頗有啟發性
void constr(char* f,char* s)
{
    
while(*f!=0)
    
{
        f
++;
    }

    
while((*f++=*s++)!=0)
    
{

    }

    
}

int main()
{

    
char f[]="Hello";
    
char s[]="World";
    
    constr(f,s);
    printf(
"%s",f);
    getchar();
    
return 0;
}
posted @ 2011-02-14 15:24 IT菜鳥 閱讀(629) | 評論 (2)編輯 收藏

VC++的預編譯功能
TAG:預編譯和宏定義,VC++,VC++的預編譯功能
TEXT:
這里介紹VC6的預編譯功能的使用,由于預編譯詳細使用比較的復雜,這里只介紹幾個最重要的預編譯指令: /Yu, /Yc,/Yx,/Fp。其它的詳細資料可以參考: MSDN -> Visual Studio 6.0 Document -> Visual C++ 6.0 Document -> VC++ Programmer Guider - >Compiler and Linker -> Details -> Creating Precompiled Header files
   預編譯頭的概念:
   所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件里(通常是以.pch為擴展名的),這個文件就稱為預編譯頭文件這些預先編譯好的代碼可以是任何的C/C++代碼,甚至是inline的函數,但是必須是穩定的,在工程開發的過程中不會被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。注意生成預編譯頭文件是很耗時間的。同時你得注意預編譯頭文件通常很大,通常有6- 7M大。注意及時清理那些沒有用的預編譯頭文件。
   也許你會問:現在的編譯器都有Time stamp的功能,編譯器在編譯整個工程的時候,它只會編譯那些經過修改的文件,而不會去編譯那些從上次編譯過,到現在沒有被修改過的文件。那么為什么還要預編譯頭文件呢?答案在這里,我們知道編譯器是以文件為單位編譯的,一個文件經過修改后,會重新編譯整個文件,當然在這個文件里包含的所有頭文件中的東西(.eg Macro, Preprocessor )都要重新處理一遍。 VC的預編譯頭文件保存的正是這部分信息。以避免每次都要重新處理這些頭文件。
   根據上文介紹,預編譯頭文件的作用當然就是提高便宜速度了,有了它你沒有必要每次都編譯那些不需要經常改變的代碼。編譯性能當然就提高了。
   要使用預編譯頭,我們必須指定一個頭文件,這個頭文件包含我們不會經常改變的代碼和其他的頭文件,然后我們用這個頭文件來生成一個預編譯頭文件(.pch文件)想必大家都知道 StdAfx.h這個文件。很多人都認為這是VC提供的一個“系統級別”的,編譯器帶的一個頭文件。其實不是的,這個文件可以是任何名字的。我們來考察一個典型的由AppWizard生成的MFC Dialog Based 程序的預編譯頭文件。(因為AppWizard會為我們指定好如何使用預編譯頭文件,默認的是StdAfx.h,這是VC起的名字)。我們會發現這個頭文件里包含了以下的頭文件:
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#include <afxcmn.h>
   這些正是使用MFC的必須包含的頭文件,當然我們不太可能在我們的工程中修改這些頭文件的,所以說他們是穩定的。
   那么我們如何指定它來生成預編譯頭文件。我們知道一個頭文件是不能編譯的。所以我們還需要一個cpp文件來生成.pch 文件。這個文件默認的就是StdAfx.cpp。在這個文件里只有一句代碼就是:#include“Stdafx.h”。原因是理所當然的,我們僅僅是要它能夠編譯而已―――也就是說,要的只是它的.cpp的擴展名。我們可以用/Yc編譯開關來指定StdAfx.cpp來生成一個.pch文件,通過/Fp編譯開關來指定生成的pch文件的名字。打開project - >Setting->C/C++ 對話框。把Category指向Precompiled Header。在左邊的樹形視圖里選擇整個工程,Project Options(右下角的那個白的地方)可以看到 /Fp “debug/PCH.pch”,這就是指定生成的.pch文件的名字,默認的通常是 <工程名>.pch。然后,在左邊的樹形視圖里選擇StdAfx.cpp,這時原來的Project Option變成了 Source File Option(原來是工程,現在是一個文件,當然變了)。在這里我們可以看到 /Yc開關,/Yc的作用就是指定這個文件來創建一個Pch文件。/Yc后面的文件名是那個包含了穩定代碼的頭文件,一個工程里只能有一個文件的可以有YC開關。VC就根據這個選項把 StdAfx.cpp編譯成一個Obj文件和一個PCH文件。
這樣,我們就設置好了預編譯頭文件。也就是說,我們可以使用預編譯頭功能了。以下是注意事項:
   1)如果使用了/Yu,就是說使用了預編譯,我們在每個.cpp文件的最開頭,包含你指定產生pch文件的.h文件(默認是stdafx.h)不然就會有問題。如果你沒有包含這個文件,就告訴你Unexpected file end.
   2)如果你把pch文件不小心丟了,根據以上的分析,你只要讓編譯器生成一個pch文件就可以了。也就是說把 stdafx.cpp(即指定/Yc的那個cpp文件)重新編譯一遍就可以了。
posted @ 2011-02-10 10:12 IT菜鳥 閱讀(382) | 評論 (0)編輯 收藏

僅列出標題
共7頁: 1 2 3 4 5 6 7 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品va在线看黑人动漫| 在线观看一区欧美| 亚洲乱码久久| 亚洲精品一二三| 亚洲激情欧美| 亚洲国产经典视频| 亚洲国产美女精品久久久久∴| 欧美成人一二三| 亚洲高清网站| 亚洲新中文字幕| 欧美亚洲日本国产| 美女在线一区二区| 欧美极品在线播放| 国产精品v片在线观看不卡| 国产精品三区www17con| 尤物九九久久国产精品的特点| 91久久国产综合久久91精品网站| 在线视频精品一区| 久久久伊人欧美| 亚洲日本无吗高清不卡| 亚洲欧美日本伦理| 牛牛精品成人免费视频| 国产情人综合久久777777| 亚洲激情黄色| 久久国产精彩视频| 亚洲欧洲视频在线| 久久成年人视频| 欧美三级日韩三级国产三级| 国内精品久久久久影院优| 亚洲网站在线观看| 欧美激情按摩在线| 久久久久久久久久久久久9999| 午夜视频在线观看一区| 免费成人网www| 国产精品午夜视频| 亚洲三级毛片| 久久久久国内| 亚洲一区二区动漫| 欧美精品一区二| 亚洲电影在线| 久久久久久**毛片大全| 夜久久久久久| 欧美国产日产韩国视频| 激情六月婷婷久久| 午夜精品亚洲| 99爱精品视频| 欧美激情一区二区三区在线视频观看 | 久久久999成人| 亚洲美洲欧洲综合国产一区| 在线视频亚洲欧美| 欧美日韩亚洲一区| 欧美国产成人在线| 国产精品v欧美精品v日韩精品| 亚洲盗摄视频| 午夜一区二区三区不卡视频| 欧美激情第1页| 欧美一区二区三区四区在线观看 | 国产亚洲综合性久久久影院| 宅男在线国产精品| 欧美激情一区三区| 久久在线免费视频| 好男人免费精品视频| 久久久蜜桃精品| 亚洲一区二区三区四区视频| 国产女主播视频一区二区| 亚洲一区二区成人| 亚洲午夜一二三区视频| 欧美日韩国产三级| 国产啪精品视频| 久久久亚洲欧洲日产国码αv| 亚洲伊人久久综合| 国内精品亚洲| 久久岛国电影| 另类专区欧美制服同性| 狠狠网亚洲精品| 亚洲高清一区二| 欧美成人一品| 亚洲欧美自拍偷拍| 亚洲欧美中文日韩v在线观看| 国产一区二区三区四区五区美女| 久久久久久久性| 欧美α欧美αv大片| 亚洲日本va午夜在线影院| 一本色道久久综合亚洲91| 欧美福利视频在线| 欧美国产日韩一区二区在线观看 | 久久久国产精品一区| 免费观看在线综合| 欧美激情麻豆| 一区二区三区视频在线看| 亚洲在线观看免费| 国产欧美日韩三区| 亚洲大片在线观看| 欧美午夜不卡| 久久字幕精品一区| 蜜臀久久99精品久久久久久9| 夜夜躁日日躁狠狠久久88av| 一本色道久久加勒比精品| 激情成人中文字幕| 亚洲激情视频网| 国产在线观看91精品一区| 女仆av观看一区| 久热精品视频在线观看一区| 亚洲在线成人精品| 久久精品官网| 午夜精品久久久久久久99黑人| 亚洲欧美中日韩| 亚洲性线免费观看视频成熟| 亚洲欧美综合精品久久成人| 亚洲乱码国产乱码精品精可以看| 一区二区免费看| 亚洲美女精品成人在线视频| 亚洲欧美日本国产有色| 亚洲精品之草原avav久久| 这里是久久伊人| 日韩一级黄色av| 欧美一级久久| 午夜亚洲激情| 欧美国产一区二区| 欧美成人激情视频免费观看| 欧美三区美女| 亚洲国产中文字幕在线观看| 国产一区二区你懂的| av成人福利| 亚洲精品三级| 另类av导航| 久久婷婷成人综合色| 国产日韩欧美一区| 一区二区三欧美| 久久久久99| 久久av在线| 国产日韩精品入口| 日韩一区二区精品在线观看| 亚洲日本激情| 老鸭窝91久久精品色噜噜导演| 美国十次成人| 激情亚洲网站| 久久国内精品视频| 欧美在线三级| 国内精品久久久久久久果冻传媒 | 亚洲精品女av网站| 亚洲欧美在线一区| 91久久综合亚洲鲁鲁五月天| 久久综合色88| 欧美成人午夜剧场免费观看| 欧美高清视频在线| 亚洲免费观看高清完整版在线观看熊 | 国产亚洲精品自拍| 亚洲欧美视频一区| 久久一区中文字幕| 亚洲精品国产精品国自产在线| 亚洲午夜电影在线观看| 久久久久久亚洲综合影院红桃| 欧美日韩直播| 欧美日韩在线综合| 一区二区三区日韩欧美精品| 浪潮色综合久久天堂| 亚洲图片激情小说| 六月丁香综合| 在线成人性视频| 99热这里只有精品8| 99精品国产一区二区青青牛奶| 久久久久久亚洲综合影院红桃| 国产精品青草久久| 亚洲天堂av电影| 99国产精品视频免费观看一公开| 亚洲一区二区免费| 国产一区二区三区四区三区四| 性欧美videos另类喷潮| 欧美一区深夜视频| 欧美黑人一区二区三区| 久久九九99| 美日韩丰满少妇在线观看| 午夜国产不卡在线观看视频| 久久久久久9| 亚洲欧美激情视频| 久久精品欧洲| 欧美一区二区三区免费大片| 亚洲国产欧美一区| 这里只有精品电影| 欧美视频精品在线| 久久永久免费| 欧美特黄a级高清免费大片a级| 狠狠88综合久久久久综合网| 久久国产精品网站| 欧美日韩在线一区| 欧美在线视频免费播放| 香蕉久久一区二区不卡无毒影院| 亚洲人精品午夜在线观看| 91久久国产精品91久久性色| 欧美大胆人体视频| 午夜综合激情| 久久综合色婷婷| 午夜亚洲性色视频| 午夜精品久久久久久久| 欧美成人黄色小视频| 欧美一区二区三区在线观看| 免费日本视频一区| 久久夜色精品国产噜噜av| 久久久久久久久久久久久久一区|