国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

C/C++ 八股文(二)

共 21329字,需瀏覽 43分鐘

 ·

2021-09-14 02:58


星標/置頂 公眾號??,硬核文章第一時間送達

說一下static關鍵字的作用

參考回答:

1 全局靜態(tài)變量

在全局變量前加上關鍵字 static,全局變量就定義成一個全局靜態(tài)變量。

靜態(tài)存儲區(qū),在整個程序運行期間一直存在。

初始化:未經(jīng)初始化的全局靜態(tài)變量會被自動初始化為 0(自動對象的值是任意的,除非他被顯式初始化);

作用域:全局靜態(tài)變量在聲明他的文件之外是不可見的,準確地說是從定義之處開始,到文件結尾。

2 局部靜態(tài)變量

在局部變量之前加上關鍵字 static,局部變量就成為一個局部靜態(tài)變量。

內存中的位置:靜態(tài)存儲區(qū)

初始化:未經(jīng)初始化的全局靜態(tài)變量會被自動初始化為 0(自動對象的值是任意的,除非他被顯式初始化);

作用域:作用域仍為局部作用域,當定義它的函數(shù)或者語句塊結束的時候,作用域結束。但是當局部靜態(tài)變量離開作用域后,并沒有銷毀,而是仍然駐留在內存當中,只不過我們不能再對它進行訪問,直到該函數(shù)再次被調用,并且值不變;

3 靜態(tài)函數(shù)

在函數(shù)返回類型前加 static,函數(shù)就定義為靜態(tài)函數(shù)。函數(shù)的定義和聲明在默認情況下都是 extern 的,但靜態(tài)函數(shù)只是在聲明他的文件當中可見,不能被其他文件所用。

函數(shù)的實現(xiàn)使用 static 修飾,那么這個函數(shù)只可在本 cpp 內使用,不會同其他 cpp 中的同名函數(shù)引起沖突;

warning:不要再頭文件中聲明 static 的全局函數(shù),不要在 cpp 內聲明非static 的全局函數(shù),如果你要在多個 cpp 中復用該函數(shù),就把它的聲明提到頭文件里去,否則 cpp 內部聲明需加上 static 修飾;

4 類的靜態(tài)成員

在類中,靜態(tài)成員可以實現(xiàn)多個對象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態(tài)成員是類的所有對象中共享的成員,而不是某個對象的成員。對多個對象來說,靜態(tài)數(shù)據(jù)成員只存儲一處,供所有對象共用

5 類的靜態(tài)函數(shù)

靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類的靜態(tài)成員,它們都不是對象成員。因此,對靜態(tài)成員的引用不需要用對象名。

在靜態(tài)成員函數(shù)的實現(xiàn)中不能直接引用類中說明的非靜態(tài)成員,可以引用類中說明的靜態(tài)成員(這點非常重要)。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時,可通過對象來引用。從中可看出,調用靜態(tài)成員函數(shù)使用如下格式:<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>);

說一下C++和C的區(qū)別

參考回答:

設計思想上:

C++ 是面向對象的語言,而C是面向過程的結構化編程語言

語法上:

  • C++ 具有封裝、繼承和多態(tài)三種特性
  • C++ 相比 C,增加多許多類型安全的功能,比如強制類型轉換、
  • C++ 支持范式編程,比如模板類、函數(shù)模板等

說一說c++中四種cast轉換

參考回答:C++ 中四種類型轉換是:static_cast, dynamic_cast,const_cast, reinterpret_cast

1、const_cast

用于將 const 變量轉為非 const

2、static_cast

用于各種隱式轉換,比如非 const 轉 const,void* 轉指針等, static_cast能用于多態(tài)向上轉化,如果向下轉能成功但是不安全,結果未知;

3、dynamic_cast

用于動態(tài)類型轉換。只能用于含有虛函數(shù)的類,用于類層次間的向上和向下轉化。只能轉指針或引用。向下轉化時,如果是非法的對于指針返回NULL,對于引用拋異常。要深入了解內部轉換的原理。

  • 向上轉換:指的是子類向基類的轉換
  • 向下轉換:指的是基類向子類的轉換

它通過判斷在執(zhí)行到該語句的時候變量的運行時類型和要轉換的類型是否相同來判斷是否能夠進行向下轉換。

4、reinterpret_cast

幾乎什么都可以轉,比如將int轉指針,可能會出問題,盡量少用;

5、為什么不使用 C 的強制轉換?

C 的強制轉換表面上看起來功能強大什么都能轉,但是轉化不夠明確,不能進行錯誤檢查,容易出錯。

請說一下C/C++ 中指針和引用的區(qū)別?

參考回答

  1. 指針有自己的一塊空間,而引用只是一個別名;
  2. 使用 sizeof 看一個指針的大小是4,而引用則是被引用對象的大?。?/section>
  3. 指針可以被初始化為 NULL,而引用必須被初始化且必須是一個已有對象 的引用;
  4. 作為參數(shù)傳遞時,指針需要被解引用才可以對對象進行操作,而直接對引 用的修改都會改變引用所指向的對象;
  5. 可以有 const 指針,但是沒有 const 引用;
  6. 指針在使用中可以指向其它對象,但是引用只能是一個對象的引用,不能 被改變;
  7. 指針可以有多級指針(**p),而引用止于一級;
  8. 指針和引用使用++運算符的意義不一樣;
  9. 如果返回動態(tài)內存分配的對象或者內存,必須使用指針,引用可能引起內存泄露。

給定三角形ABC和一點P(x,y,z),判斷點P是否在ABC內,給出思路并手寫代碼

參考回答:

根據(jù)面積法,如果 P 在三角形 ABC 內,那么三角形 ABP 的面積+三角形 BCP 的面積+三角形 ACP 的面積應該等于三角形 ABC 的面積。算法如下:

#include <iostream>
#include <math.h>
using namespace std;
#define ABS_FLOAT_0 0.0001
struct point_float
{
float x;
float y;
};
/**

* @brief 計算三角形面積

*/

float GetTriangleSquar(const point_float pt0, const point_float pt1, const point_float pt2)
{
    point_float AB,   BC;
    AB.x = pt1.x - pt0.x;
    AB.y = pt1.y - pt0.y;
    BC.x = pt2.x - pt1.x;
    BC.y = pt2.y - pt1.y;
    return fabs((AB.x * BC.y - AB.y * BC.x)) / 2.0f;
}
/**

* @brief 判斷給定一點是否在三角形內或邊上

*/
bool IsInTriangle(const point_float A, const point_float B, const point_float C, const point_float D)
{
    float SABC, SADB, SBDC, SADC;
    SABC = GetTriangleSquar(A, B, C);
    SADB = GetTriangleSquar(A, D, B);
    SBDC = GetTriangleSquar(B, D, C);
    SADC = GetTriangleSquar(A, D, C);
    float SumSuqar = SADB + SBDC + SADC;
    if ((-ABS_FLOAT_0 < (SABC - SumSuqar)) && ((SABC - SumSuqar) < 
        ABS_FLOAT_0))
    {
        return true;
    }
    else
    {
        return false;
    }
}

怎么判斷一個數(shù)是二的倍數(shù),怎么求一個數(shù)中有幾個1,說一下你的思路并手寫代碼

參考回答:

  1. 判斷一個數(shù)是不是二的倍數(shù),即判斷該數(shù)二進制末位是不是 0:a % 2 == 0 或者a & 0x0001 == 0。
  2. 求一個數(shù)中 1 的位數(shù),可以直接逐位除十取余判斷:
int fun(long x)
{
int _count = 0;
while(x)
{
    if(x % 10 == 1)
         ++_count;
    x /= 10;
}
return _count;
}
int main()
{
    cout << fun(123321) << endl;
    return 0;
}

請你回答一下野指針是什么?

參考回答:

野指針就是指向一個已刪除的對象或者未申請訪問受限內存區(qū)域的指針

請你介紹一下 C++ 中的智能指針

參考回答:

智能指針主要用于管理在堆上分配的內存,它將普通的指針封裝為一個棧對象。當棧對象的生存周期結束后,會在析構函數(shù)中釋放掉申請的內存,從而防止內存泄漏。C++ 11 中最常用的智能指針類型為 shared_ptr,它采用引用計數(shù)的方法,記錄當前內存資源被多少個智能指針引用。該引用計數(shù)的內存在堆上分配。當新增一個時引用計數(shù)加1,當過期時引用計數(shù)減一。只有引用計數(shù)為 0 時,智能指針才會自動釋放引用的內存資源。對 shared_ptr 進行初始化時不能將一個普通指針直接賦值給智能指針,因為一個是指針,一個是類??梢酝ㄟ^ make_shared 函數(shù)或者通過構造函數(shù)傳入普通指針。并可以通過 get 函數(shù)獲得普通指針。

請你回答一下智能指針有沒有內存泄露的情況

參考回答:

當兩個對象相互使用一個 shared_ptr 成員變量指向對方,會造成循環(huán)引用,使引用計數(shù)失效,從而導致內存泄漏。例如:

請你來說一下智能指針的內存泄漏如何解決

參考回答:

為了解決循環(huán)引用導致的內存泄漏,引入了 weak_ptr 弱指針,weak_ptr 的構造函數(shù)不會修改引用計數(shù)的值,從而不會對對象的內存進行管理,其類似一個普通指針,但不指向引用計數(shù)的共享內存,但是其可以檢測到所管理的對象是否已經(jīng)被釋放,從而避免非法訪問。

請你回答一下為什么析構函數(shù)必須是虛函數(shù)?為什么C++默認的析構函數(shù)不是虛函數(shù) 考點:虛函數(shù) 析構函數(shù)

參考回答:

將可能會被繼承的父類的析構函數(shù)設置為虛函數(shù),可以保證當我們new一個子類,然后使用基類指針指向該子類對象,釋放基類指針時可以釋放掉子類的空間,防止內存泄漏。

C++ 默認的析構函數(shù)不是虛函數(shù)是因為虛函數(shù)需要額外的虛函數(shù)表和虛表指針,占用額外的內存。而對于不會被繼承的類來說,其析構函數(shù)如果是虛函數(shù),就會浪費內存。因此 C++ 默認的析構函數(shù)不是虛函數(shù),而是只有當需要當作父類時,設置為虛函數(shù)。

請你來說一下 C++ 中析構函數(shù)的作用

參考回答:

析構函數(shù)與構造函數(shù)對應,當對象結束其生命周期,如對象所在的函數(shù)已調用完畢時,系統(tǒng)會自動執(zhí)行析構函數(shù)。

析構函數(shù)名也應與類名相同,只是在函數(shù)名前面加一個位取反符~,例如 ~stud( ),以區(qū)別于構造函數(shù)。它不能帶任何參數(shù),也沒有返回值(包括 void 類型)。只能有一個析構函數(shù),不能重載。

如果用戶沒有編寫析構函數(shù),編譯系統(tǒng)會自動生成一個缺省的析構函數(shù)(即使自定義了析構函數(shù),編譯器也總是會為我們合成一個析構函數(shù),并且如果自定義了析構函數(shù),編譯器在執(zhí)行時會先調用自定義的析構函數(shù)再調用合成的析構函數(shù)),它也不進行任何操作。所以許多簡單的類中沒有用顯式的析構函數(shù)。

如果一個類中有指針,且在使用的過程中動態(tài)的申請了內存,那么最好顯示構造析構函數(shù)在銷毀類之前,釋放掉申請的內存空間,避免內存泄漏。

類析構順序:

  • 派生類本身的析構函數(shù);
  • 對象成員析構函數(shù);
  • 基類析構函數(shù)。

請你來說一下靜態(tài)函數(shù)和虛函數(shù)的區(qū)別

參考回答:

靜態(tài)函數(shù)在編譯的時候就已經(jīng)確定運行時機,虛函數(shù)在運行的時候動態(tài)綁定。虛函數(shù)因為用了虛函數(shù)表機制,調用的時候會增加一次內存開銷

請你來說一說重載和覆蓋

參考回答:

重載:兩個函數(shù)名相同,但是參數(shù)列表不同(個數(shù),類型),返回值類型沒有要求,在同一作用域中

重寫:子類繼承了父類,父類中的函數(shù)是虛函數(shù),在子類中重新定義了這個虛函數(shù),這種情況是重寫

請你說一說 strcpy 和 strlen

參考回答:

strcpy 是字符串拷貝函數(shù),原型:

char strcpy(char dest, const char *src);

從 src 逐字節(jié)拷貝到 dest,直到遇到 '\0' 結束,因為沒有指定長度,可能會導致拷貝越界,造成緩沖區(qū)溢出漏洞,安全版本是 strncpy 函數(shù)。

strlen 函數(shù)是計算字符串長度的函數(shù),返回從開始到 '\0' 之間的字符個數(shù)。

請你說一說你理解的虛函數(shù)和多態(tài)

參考回答:

多態(tài)的實現(xiàn)主要分為靜態(tài)多態(tài)和動態(tài)多態(tài),靜態(tài)多態(tài)主要是重載,在編譯的時候就已經(jīng)確定;動態(tài)多態(tài)是用虛函數(shù)機制實現(xiàn)的,在運行期間動態(tài)綁定。舉個例子:一個父類類型的指針指向一個子類對象時候,使用父類的指針去調用子類中重寫了的父類中的虛函數(shù)的時候,會調用子類重寫過后的函數(shù),在父類中聲明為加了 virtual 關鍵字的函數(shù),在子類中重寫時候不需要加 virtual 也是虛函數(shù)。

虛函數(shù)的實現(xiàn):在有虛函數(shù)的類中,類的最開始部分是一個虛函數(shù)表的指針,這個指針指向一個虛函數(shù)表,表中放了虛函數(shù)的地址,實際的虛函數(shù)在代碼段(.text)中。當子類繼承了父類的時候也會繼承其虛函數(shù)表,當子類重寫父類中虛函數(shù)時候,會將其繼承到的虛函數(shù)表中的地址替換為重新寫的函數(shù)地址。使用了虛函數(shù),會增加訪問內存開銷,降低效率。

請你來回答一下 ++i 和 i++ 的區(qū)別

參考回答:

++i 先自增 1,再返回,i++ 先返回 i,再自增 1

請你來寫個函數(shù)在 main 函數(shù)執(zhí)行前先運行

參考回答:

__attribute((constructor))void before()
{
    printf("before main\n");
}

以下四行代碼的區(qū)別是什么?

const char * arr = "123";
char * brr = "123"
const char crr[] = "123"
char drr[] = "123";

參考回答:

const char * arr = "123";
//字符串123保存在常量區(qū),const本來是修飾arr指向的值不能通過arr去修改,但是字符串“123”在常量區(qū),本來就不能改變,所以加不加const效果都一樣
char * brr = "123";
//字符串123保存在常量區(qū),這個arr指針指向的是同一個位置,同樣不能通過brr去修改"123"的值
const char crr[] = "123";
//這里123本來是在棧上的,但是編譯器可能會做某些優(yōu)化,將其放到常量區(qū)
char drr[] = "123";
//字符串123保存在棧區(qū),可以通過drr去修改

請你來說一下 C++ 里是怎么定義常量的?常量存放在內存的哪個位置?

參考回答:

常量在 C++ 里的定義就是一個 top-level const 加上對象類型,常量定義必須初始化。對于局部對象,常量存放在棧區(qū),對于全局對象,常量存放在全局/靜態(tài)存儲區(qū)。對于字面值常量,常量存放在常量存儲區(qū)。

請你來回答一下 const 修飾成員函數(shù)的目的是什么?

參考回答:

const 修飾的成員函數(shù)表明函數(shù)調用不會對對象做出任何更改,事實上,如果確認不會對對象做更改,就應該為函數(shù)加上 const 限定,這樣無論 const 對象還是普通對象都可以調用該函數(shù)。

如果同時定義了兩個函數(shù),一個帶 const,一個不帶,會有問題嗎?

參考回答:

不會,這相當于函數(shù)的重載。

請你來說一說隱式類型轉換

參考回答:

首先,對于內置類型,低精度的變量給高精度變量賦值會發(fā)生隱式類型轉換,其次,對于只存在單個參數(shù)的構造函數(shù)的對象構造來說,函數(shù)調用可以直接使用該參數(shù)傳入,編譯器會自動調用其構造函數(shù)生成臨時對象。

請你來說一說 C++ 函數(shù)??臻g的最大值

參考回答:

默認是 1M,不過可以調整

請你回答一下 new/delete 與 malloc/free 的區(qū)別是什么

參考回答:

首先,new/delete 是 C++ 的關鍵字,而 malloc/free 是 C語言的庫函數(shù),后者使用必須指明申請內存空間的大小,對于類類型的對象,后者不會調用構造函數(shù)和析構函數(shù)

請你說說你了解的RTTI

參考回答:

運行時類型檢查,在 C++ 層面主要體現(xiàn)在 dynamic_cast 和typeid,VS 中虛函數(shù)表的 -1 位置存放了指向 type_info 的指針。對于存在虛函數(shù)的類型,typeid 和 dynamic_cast 都會去查詢 type_info

請你說說虛函數(shù)表具體是怎樣實現(xiàn)運行時多態(tài)的?

參考回答:

子類若重寫父類虛函數(shù),虛函數(shù)表中,該函數(shù)的地址會被替換,對于存在虛函數(shù)的類的對象,在 VS 中,對象的對象模型的頭部存放指向虛函數(shù)表的指針,通過該機制實現(xiàn)多態(tài)。

請你說說C語言是怎么進行函數(shù)調用的?

參考回答:

每一個函數(shù)調用都會分配函數(shù)棧,在棧內進行函數(shù)執(zhí)行過程。調用前,先把返回地址壓棧,然后把當前函數(shù)的 esp 指針壓棧。

請你說說 C++ 如何處理返回值?

參考回答:

生成一個臨時變量,把它的引用作為函數(shù)參數(shù)傳入函數(shù)內。

請你回答一下 C+ +中拷貝賦值函數(shù)的形參能否進行值傳遞?

參考回答:

不能。如果是這種情況下,調用拷貝構造函數(shù)的時候,首先要將實參傳遞給形參,這個傳遞的時候又要調用拷貝構造函數(shù)。。如此循環(huán),無法完成拷貝,棧也會滿。

請你說一說 select

參考回答:

select 在使用前,先將需要監(jiān)控的描述符對應的 bit 位置 1,然后將其傳給 select,當有任何一個事件發(fā)生時,select 將會返回所有的描述符,需要在應用程序自己遍歷去檢查哪個描述符上有事件發(fā)生,效率很低,并且其不斷在內核態(tài)和用戶態(tài)進行描述符的拷貝,開銷很大

請你說說 fork,wait,exec 函數(shù)

參考回答:

父進程產生子進程使用 fork 拷貝出來一個父進程的副本,此時只拷貝了父進程的頁表,兩個進程都讀同一塊內存,當有進程寫的時候使用寫實拷貝機制分配內存,exec 函數(shù)可以加載一個 elf 文件去替換父進程,從此父進程和子進程就可以運行不同的程序了。fork 從父進程返回子進程的 pid,從子進程返回 0.調用了 wait 的父進程將會發(fā)生阻塞,直到有子進程狀態(tài)改變,執(zhí)行成功返回 0,錯誤返回 -1。exec 執(zhí)行成功則子進程從新的程序開始運行,無返回值,執(zhí)行失敗返回 -1

請你回答一下靜態(tài)函數(shù)和虛函數(shù)的區(qū)別

參考回答:

靜態(tài)函數(shù)在編譯的時候就已經(jīng)確定運行時機,虛函數(shù)在運行的時候動態(tài)綁定。虛函數(shù)因為用了虛函數(shù)表機制,調用的時候會增加一次內存開銷

請你說一說重載和覆蓋

參考回答:

  • 重載:兩個函數(shù)名相同,但是參數(shù)列表不同(個數(shù),類型),返回值類型沒有要求,在同一作用域中
  • 重寫:子類繼承了父類,父類中的函數(shù)是虛函數(shù),在子類中重新定義了這個虛函數(shù),這種情況是重寫

請你來說一下map和set有什么區(qū)別,分別又是怎么實現(xiàn)的?

參考回答:

map 和 set 都是 C++ 的關聯(lián)容器,其底層實現(xiàn)都是紅黑樹(RB-Tree)。由于 map 和 set 所開放的各種操作接口,RB-tree 也都提供了,所以幾乎所有的 map 和set的操作行為,都只是轉調 RB-tree 的操作行為。

map 和 set 區(qū)別在于:

  1. map 中的元素是 key-value(關鍵字—值)對:關鍵字起到索引的作用,值則表示與索引相關聯(lián)的數(shù)據(jù);Set 與之相對就是關鍵字的簡單集合,set 中每個元素只包含一個關鍵字。

  2. set 的迭代器是 const 的,不允許修改元素的值;map 允許修改 value,但不允許修改 key。其原因是因為 map 和 set 是根據(jù)關鍵字排序來保證其有序性的,如果允許修改 key 的話,那么首先需要刪除該鍵,然后調節(jié)平衡,再插入修改后的鍵值,調節(jié)平衡,如此一來,嚴重破壞了 map 和 set 的結構,導致 iterator 失效,不知道應該指向改變前的位置,還是指向改變后的位置。所以 STL 中將 set 的迭代器設置成 const,不允許修改迭代器的值;而 map 的迭代器則不允許修改 key 值,允許修改 value 值。

  3. map 支持下標操作,set 不支持下標操作。map 可以用 key 做下標,map 的下標運算符[ ]將關鍵碼作為下標去執(zhí)行查找,如果關鍵碼不存在,則插入一個具有該關鍵碼和 mapped_type 類型默認值的元素至 map 中,因此下標運算符[ ]在 map 應用中需要慎用,const_map 不能用,只希望確定某一個關鍵值是否存在而不希望插入元素時也不應該使用,mapped_type 類型沒有默認值也不應該使用。如果 find 能解決需要,盡可能用 find。

請你來介紹一下 STL 的 allocaotr

參考回答:

STL 的分配器用于封裝 STL 容器在內存管理上的底層細節(jié)。在 C++ 中,其內存配置和釋放如下:

  • new 運算分兩個階段:
  1. 調用 ::operator new 配置內存;
  2. 調用對象構造函數(shù)構造對象內容
  • delete 運算分兩個階段:
  1. 調用對象希構函數(shù);
  2. 掉員工::operator delete釋放內存

為了精密分工,STL allocator 將兩個階段操作區(qū)分開來:內存配置有alloc::allocate()負責,內存釋放由alloc::deallocate()負責;對象構造由::construct()負責,對象析構由::destroy()負責。

同時為了提升內存管理的效率,減少申請小內存造成的內存碎片問題,SGI STL 采用了兩級配置器,當分配的空間大小超過 128B 時,會使用第一級空間配置器;當分配的空間大小小于 128B 時,將使用第二級空間配置器。第一級空間配置器直接使用malloc()、realloc()、free()函數(shù)進行內存空間的分配和釋放,而第二級空間配置器采用了內存池技術,通過空閑鏈表來管理內存。

請你來說一說 STL 迭代器刪除元素

參考回答:

這個主要考察的是迭代器失效的問題。

  1. 對于序列容器vector,deque來說,使用erase(itertor)后,后邊的每個元素的迭代器都會失效,但是后邊每個元素都會往前移動一個位置,但是erase會返回下一個有效的迭代器;
  2. 對于關聯(lián)容器map set來說,使用了erase(iterator)后,當前元素的迭代器失效,但是其結構是紅黑樹,刪除當前元素的,不會影響到下一個元素的迭代器,所以在調用erase之前,記錄下一個元素的迭代器即可。
  3. 對于list來說,它使用了不連續(xù)分配的內存,并且它的erase方法也會返回下一個有效的iterator,因此上面兩種正確的方法都可以使用。

請你說一說 STL 中 MAP 數(shù)據(jù)存放形式

參考回答:紅黑樹。unordered map底層結構是哈希表

請你講講 STL 有什么基本組成

參考回答:

STL 主要由:以下幾部分組成:

容器迭代器仿函數(shù)算法分配器配接器

他們之間的關系:分配器給容器分配存儲空間,算法通過迭代器獲取容器中的內容,仿函數(shù)可以協(xié)助算法完成各種操作,配接器用來套接適配仿函數(shù)

請你說說 STL 中 map 與 unordered_map

參考回答:

  1. Map映射,map 的所有元素都是 pair,同時擁有實值(value)和鍵值(key)。pair 的第一元素被視為鍵值,第二元素被視為實值。所有元素都會根據(jù)元素的鍵值自動被排序。不允許鍵值重復。

底層實現(xiàn):紅黑樹

適用場景:有序鍵值對不重復映射

  1. Multimap 多重映射。multimap 的所有元素都是 pair,同時擁有實值(value)和鍵值(key)。pair 的第一元素被視為鍵值,第二元素被視為實值。所有元素都會根據(jù)元素的鍵值自動被排序。允許鍵值重復。

底層實現(xiàn):紅黑樹

適用場景:有序鍵值對可重復映射

請你說一說 vector 和 list 的區(qū)別,應用,越詳細越好

  1. Vector 連續(xù)存儲的容器,動態(tài)數(shù)組,在堆上分配空間

底層實現(xiàn):數(shù)組

兩倍容量增長:

vector 增加(插入)新元素時,如果未超過當時的容量,則還有剩余空間,那么直接添加到最后(插入指定位置),然后調整迭代器。如果沒有剩余空間了,則會重新配置原有元素個數(shù)的兩倍空間,然后將原空間元素通過復制的方式初始化新空間,再向新空間增加元素,最后析構并釋放原空間,之前的迭代器會失效。

性能:

訪問:O(1)

插入:在最后插入(空間夠):很快

  • 在最后插入(空間不夠):需要內存申請和釋放,以及對之前數(shù)據(jù)進行拷貝。
  • 在中間插入(空間夠):內存拷貝
  • 在中間插入(空間不夠):需要內存申請和釋放,以及對之前數(shù)據(jù)進行拷貝。刪除:
  • 在最后刪除:很快
  • 在中間刪除:內存拷貝

適用場景:經(jīng)常隨機訪問,且不經(jīng)常對非尾節(jié)點進行插入刪除。2. List 動態(tài)鏈表,在堆上分配空間,每插入一個元數(shù)都會分配空間,每刪除一個元素都會釋放空間。

底層:雙向鏈表

性能:

訪問:隨機訪問性能很差,只能快速訪問頭尾節(jié)點。

插入:很快,一般是常數(shù)開銷

刪除:很快,一般是常數(shù)開銷

適用場景:經(jīng)常插入刪除大量數(shù)據(jù)

區(qū)別

  • vector 底層實現(xiàn)是數(shù)組;list 是雙向 鏈表。
  • vector 支持隨機訪問,list 不支持。
  • vector 是順序內存,list 不是。
  • vector 在中間節(jié)點進行插入刪除會導致內存拷貝,list 不會。
  • vector 一次性分配好內存,不夠時才進行 2 倍擴容;list 每次插入新節(jié)點都會進行內存申請。
  • vector 隨機訪問性能好,插入刪除性能差;list 隨機訪問性能差,插入刪除性能好。應用vector 擁有一段連續(xù)的內存空間,因此支持隨機訪問,如果需要高效的隨即訪問,而不在乎插入和刪除的效率,使用 vector。

list 擁有一段不連續(xù)的內存空間,如果需要高效的插入和刪除,而不關心隨機訪問,則應使用 list。

請你來說一下 STL 中迭代器的作用,有指針為何還要迭代器

參考回答:

  1. 迭代器

Iterator(迭代器)模式又稱 Cursor(游標)模式,用于提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示?;蛘哌@樣說可能更容易理解:Iterator 模式是運用于聚合對象的一種模式,通過運用該模式,使得我們可以在不知道對象內部表示的情況下,按照一定順序(由 iterator 提供的方法)訪問聚合對象中的各個元素。

由于 Iterator 模式的以上特性:與聚合對象耦合,在一定程度上限制了它的廣泛運用,一般僅用于底層聚合支持類,如 STL 的 list、vector、stack 等容器類及 ostream_iterator 等擴展 iterator。

  1. 迭代器和指針的區(qū)別

迭代器不是指針,是類模板,表現(xiàn)的像指針。他只是模擬了指針的一些功能,通過重載了指針的一些操作符,->、*、++、--等。迭代器封裝了指針,是一個“可遍歷STL( Standard Template Library)容器內全部或部分元素”的對象, 本質是封裝了原生指針,是指針概念的一種提升(lift),提供了比指針更高級的行為,相當于一種智能指針,他可以根據(jù)不同類型的數(shù)據(jù)結構來實現(xiàn)不同的 ++,--等操作。

迭代器返回的是對象引用而不是對象的值,所以 cout 只能輸出迭代器使用 * 取值后的值而不能直接輸出其自身。

  1. 迭代器產生原因

Iterator 類的訪問方式就是把不同集合類的訪問邏輯抽象出來,使得不用暴露集合內部的結構而達到循環(huán)遍歷集合的效果。

請你說一說epoll原理

參考回答:

調用順序:

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);

首先創(chuàng)建一個 epoll 對象,然后使用 epoll_ctl 對這個對象進行操作,把需要監(jiān)控的描述添加進去,這些描述如將會以 epoll_event 結構體的形式組成一顆紅黑樹,接著阻塞在 epoll_wait,進入大循環(huán),當某個 fd 上有事件發(fā)生時,內核將會把其對應的結構體放入到一個鏈表中,返回有事件發(fā)生的鏈表。

n 個整數(shù)的無序數(shù)組,找到每個元素后面比它大的第一個數(shù),要求時間復雜度為 O(N)

參考回答:

vector<int> findMax(vector<int>num)
{
if(num.size()==0)return num;
vector<int>res(num.size());
int i=0;
stack<int>s;
while(i<num.size())
{
if(s.empty()||num[s.top()]>=num[i])
{
s.push(i++);
}
else
{
res[s.top()]=num[i];
s.pop();
}
}
while(!s.empty())
{
res[s.top()]=INT_MAX;
s.pop();
}
for(int i=0; i<res.size(); i++)
cout<<res[i]<<endl;
return res;
}

請你回答一下 STL 里 resize 和 reserve 的區(qū)別

參考回答:

resize():改變當前容器內含有元素的數(shù)量(size()),eg: vectorv; v.resize(len);v的size變?yōu)閘en,如果原來v的size小于len,那么容器新增(len-size)個元素,元素的值為默認為0.當v.push_back(3);之后,則是3是放在了v的末尾,即下標為len,此時容器是size為len+1;

reserve():改變當前容器的最大容量(capacity),它不會生成元素,只是確定這個容器允許放入多少對象,如果reserve(len)的值大于當前的capacity(),那么會重新分配一塊能存len個對象的空間,然后把之前v.size()個對象通過copy construtor復制過來,銷毀之前的內存;

測試代碼如下:

#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> a;
    a.reserve(100);
    a.resize(50);
    cout<<a.size()<<"  "<<a.capacity()<<endl;
        //50  100
    a.resize(150);
    cout<<a.size()<<"  "<<a.capacity()<<endl;
        //150  200
    a.reserve(50);
    cout<<a.size()<<"  "<<a.capacity()<<endl;
        //150  200
    a.resize(50);
    cout<<a.size()<<"  "<<a.capacity()<<endl;
        //50  200    
}

請你來說一下 C++ 中類成員的訪問權限

參考回答:

C++ 通過 public、protected、private 三個關鍵字來控制成員變量和成員函數(shù)的訪問權限,它們分別表示公有的、受保護的、私有的,被稱為成員訪問限定符。在類的內部(定義類的代碼內部),無論成員被聲明為 public、protected 還是 private,都是可以互相訪問的,沒有訪問權限的限制。在類的外部(定義類的代碼之外),只能通過對象訪問成員,并且通過對象只能訪問 public 屬性的成員,不能訪問 private、protected 屬性的成員

請你來說一下 C++ 中 struct 和 class 的區(qū)別

參考回答:

在 C++ 中,可以用 struct 和 class 定義類,都可以繼承。區(qū)別在于:structural 的默認繼承權限和默認訪問權限是 public,而 class 的默認繼承權限和默認訪問權限是 private。另外,class 還可以定義模板類形參,比如 template。

請你回答一下C++類內可以定義引用數(shù)據(jù)成員嗎?

參考回答:

可以,必須通過成員函數(shù)初始化列表初始化。

請你回答一下 malloc 的原理,另外 brk 系統(tǒng)調用和 mmap 系統(tǒng)調用的作用分別是什么?

參考回答:

Malloc 函數(shù)用于動態(tài)分配內存。為了減少內存碎片和系統(tǒng)調用的開銷,malloc 其采用內存池的方式,先申請大塊內存作為堆區(qū),然后將堆區(qū)分為多個內存塊,以塊作為內存管理的基本單位。當用戶申請內存時,直接從堆區(qū)分配一塊合適的空閑塊。Malloc 采用隱式鏈表結構將堆區(qū)分成連續(xù)的、大小不一的塊,包含已分配塊和未分配塊;同時 malloc 采用顯示鏈表結構來管理所有的空閑塊,即使用一個雙向鏈表將空閑塊連接起來,每一個空閑塊記錄了一個連續(xù)的、未分配的地址。

當進行內存分配時,Malloc 會通過隱式鏈表遍歷所有的空閑塊,選擇滿足要求的塊進行分配;當進行內存合并時,malloc 采用邊界標記法,根據(jù)每個塊的前后塊是否已經(jīng)分配來決定是否進行塊合并。

Malloc 在申請內存時,一般會通過 brk 或者 mmap 系統(tǒng)調用進行申請。其中當申請內存小于 128K 時,會使用系統(tǒng)函數(shù) brk 在堆區(qū)中分配;而當申請內存大于 128K 時,會使用系統(tǒng)函數(shù) mmap 在映射區(qū)分配。

請你說一說C++的內存管理是怎樣的?

參考回答:

在 C++ 中,虛擬內存分為代碼段、數(shù)據(jù)段、BSS段、堆區(qū)、文件映射區(qū)以及棧區(qū)六部分。

  • 代碼段:包括只讀存儲區(qū)和文本區(qū),其中只讀存儲區(qū)存儲字符串常量,文本區(qū)存儲程序的機器代碼。
  • 數(shù)據(jù)段:存儲程序中已初始化的全局變量和靜態(tài)變量
  • bss 段:存儲未初始化的全局變量和靜態(tài)變量(局部+全局),以及所有被初始化為0的全局變量和靜態(tài)變量。
  • 堆區(qū):調用new/malloc函數(shù)時在堆區(qū)動態(tài)分配內存,同時需要調用delete/free來手動釋放申請的內存。
  • 映射區(qū):存儲動態(tài)鏈接庫以及調用mmap函數(shù)進行的文件映射
  • 棧:使用??臻g存儲函數(shù)的返回地址、參數(shù)、局部變量、返回值

請你來說一下 C++/C 的內存分配

參考回答:

32bitCPU 可尋址 4G 線性空間,每個進程都有各自獨立的 4G 邏輯地址,其中 0~3G 是用戶態(tài)空間,3~4G 是內核空間,不同進程相同的邏輯地址會映射到不同的物理地址中。其邏輯地址其劃分如下:

各個段說明如下:

3G 用戶空間和 1G 內核空間

靜態(tài)區(qū)域:

  • text segment(代碼段):包括只讀存儲區(qū)和文本區(qū),其中只讀存儲區(qū)存儲字符串常量,文本區(qū)存儲程序的機器代碼。

  • data segment(數(shù)據(jù)段):存儲程序中已初始化的全局變量和靜態(tài)變量

  • bss segment:存儲未初始化的全局變量和靜態(tài)變量(局部+全局),以及所有被初始化為0的全局變量和靜態(tài)變量,對于未初始化的全局變量和靜態(tài)變量,程序運行main之前時會統(tǒng)一清零。即未初始化的全局變量編譯器會初始化為 0 動態(tài)區(qū)域:

  • heap(堆):當進程未調用 malloc 時是沒有堆段的,只有調用 malloc 時采用分配一個堆,并且在程序運行過程中可以動態(tài)增加堆大小(移動 break 指針),從低地址向高地址增長。分配小內存時使用該區(qū)域。堆的起始地址由 mm_struct 結構體中的 start_brk 標識,結束地址由 brk 標識。

  • memory mapping segment(映射區(qū)):存儲動態(tài)鏈接庫等文件映射、申請大內存( malloc 時調用 mmap 函數(shù))

  • stack(棧):使用??臻g存儲函數(shù)的返回地址、參數(shù)、局部變量、返回值,從高地址向低地址增長。在創(chuàng)建進程時會有一個最大棧大小,Linux 可以通過 ulimi t命令指定。

請你回答一下如何判斷內存泄漏?

參考回答:

內存泄漏通常是由于調用了 malloc/new 等內存申請的操作,但是缺少了對應的 free/delete。為了判斷內存是否泄露,我們一方面可以使用 linux 環(huán)境下的內存泄漏檢查工具 Valgrind,另一方面我們在寫代碼時可以添加內存申請和釋放的統(tǒng)計功能,統(tǒng)計當前申請和釋放的內存是否一致,以此來判斷內存是否泄露。

請你來說一下什么時候會發(fā)生段錯誤

參考回答:

段錯誤通常發(fā)生在訪問非法內存地址的時候,具體來說分為以下幾種情況:

  • 使用野指針
  • 試圖修改字符串常量的內容

請你來回答一下什么是 memory leak,也就是內存泄漏

參考回答:

內存泄漏(memory leak)是指由于疏忽或錯誤造成了程序未能釋放掉不再使用的內存的情況。內存泄漏并非指內存在物理上的消失,而是應用程序分配某段內存后,由于設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。

內存泄漏的分類:

  • 堆內存泄漏 (Heap leak)。對內存指的是程序運行中根據(jù)需要分配通過 malloc,realloc new 等從堆中分配的一塊內存,再是完成后必須通過調用對應的 free或者delete 刪掉。如果程序的設計的錯誤導致這部分內存沒有被釋放,那么此后這塊內存將不會被使用,就會產生Heap Leak.
  • 系統(tǒng)資源泄露(Resource Leak)。主要指程序使用系統(tǒng)分配的資源比如 Bitmap,handle ,SOCKET 等沒有使用相應的函數(shù)釋放掉,導致系統(tǒng)資源的浪費,嚴重可導致系統(tǒng)效能降低,系統(tǒng)運行不穩(wěn)定。
  • 沒有將基類的析構函數(shù)定義為虛函數(shù)。當基類指針指向子類對象時,如果基類的析構函數(shù)不是 virtual,那么子類的析構函數(shù)將不會被調用,子類的資源沒有正確是釋放,因此造成內存泄露。

請你來說一下 reactor 模型組成

參考回答:

reactor 模型要求主線程只負責監(jiān)聽文件描述上是否有事件發(fā)生,有的話就立即將該事件通知工作線程,除此之外,主線程不做任何其他實質性的工作,讀寫數(shù)據(jù)、接受新的連接以及處理客戶請求均在工作線程中完成。其模型組成如下:

  1. Handle:即操作系統(tǒng)中的句柄,是對資源在操作系統(tǒng)層面上的一種抽象,它可以是打開的文件、一個連接(Socket)、Timer等。由于Reactor模式一般使用在網(wǎng)絡編程中,因而這里一般指Socket Handle,即一個網(wǎng)絡連接。
  2. Synchronous Event Demultiplexer(同步事件復用器):阻塞等待一系列的Handle中的事件到來,如果阻塞等待返回,即表示在返回的 Handle中可以不阻塞的執(zhí)行返回的事件類型。這個模塊一般使用操作系統(tǒng)的 select 來實現(xiàn)。
  3. Initiation Dispatcher:用于管理 Event Handler,即 EventHandler 的容器,用以注冊、移除 EventHandler 等;另外,它還作為 Reactor 模式的入口調用 Synchronous Event Demultiplexerselect 方法以阻塞等待事件返回,當阻塞等待返回時,根據(jù)事件發(fā)生的Handle將其分發(fā)給對應的Event Handler 處理,即回調 EventHandler中的 handle_event() 方法。4.Event Handler:定義事件處理方法:handle_event(),以供InitiationDispatcher回調使用。
  4. Concrete Event Handler:事件 EventHandler 接口,實現(xiàn)特定事件處理邏輯。

請自己設計一下如何采用單線程的方式處理高并發(fā)

參考回答:

在單線程模型中,可以采用 I/O 復用來提高單線程處理多個請求的能力,然后再采用事件驅動模型,基于異步回調來處理事件來

請你說說 select,epoll 的區(qū)別,原理,性能,限制都說一說

參考回答:

  1. IO 多路復用

IO 復用模型在阻塞 IO 模型上多了一個 select 函數(shù),select 函數(shù)有一個參數(shù)是文件描述符集合,意思就是對這些的文件描述符進行循環(huán)監(jiān)聽,當某個文件描述符就緒的時候,就對這個文件描述符進行處理。

這種 IO 模型是屬于阻塞的 IO。但是由于它可以對多個文件描述符進行阻塞監(jiān)聽,所以它的效率比阻塞 IO 模型高效。

IO 多路復用就是我們說的select,poll,epoll。select/epoll的好處就在于單個 process 就可以同時處理多個網(wǎng)絡連接的 IO。它的基本原理就是 select,poll,epoll 這個 function 會不斷的輪詢所負責的所有 socket,當某個 socket 有數(shù)據(jù)到達了,就通知用戶進程。

當用戶進程調用了 select,那么整個進程會被 block,而同時,kernel 會“監(jiān)視”所有 select 負責的 socket,當任何一個 socket 中的數(shù)據(jù)準備好了,select 就會返回。這個時候用戶進程再調用 read 操作,將數(shù)據(jù)從 kernel 拷貝到用戶進程。

所以,I/O 多路復用的特點是通過一種機制一個進程能同時等待多個文件描述符,而這些文件描述符(套接字描述符)其中的任意一個進入讀就緒狀態(tài),select() 函數(shù)就可以返回。

I/O 多路復用和阻塞I/O其實并沒有太大的不同,事實上,還更差一些。因為這里需要使用兩個system call (select 和 recvfrom),而blocking IO只調用了一個system call (recvfrom)。但是,用select的優(yōu)勢在于它可以同時處理多個connection。

所以,如果處理的連接數(shù)不是很高的話,使用select/epollweb server不一定比使用multi-threading + blocking IOweb server性能更好,可能延遲還更大。select/epoll的優(yōu)勢并不是對于單個連接能處理得更快,而是在于能處理更多的連接。)

IO multiplexing Model中,實際中,對于每一個socket,一般都設置成為non-blocking,但是,如上圖所示,整個用戶的process其實是一直被block的。只不過process是被select這個函數(shù)block,而不是被socket IOblock。

2、select

select:是最初解決 IO 阻塞問題的方法。用結構體 fd_set 來告訴內核監(jiān)聽多個文件描述符,該結構體被稱為描述符集。由數(shù)組來維持哪些描述符被置位了。對結構體的操作封裝在三個宏定義中。通過輪尋來查找是否有描述符要被處理。存在的問題:

  • 內置數(shù)組的形式使得 select 的最大文件數(shù)受限與 FD_SIZE;
  • 每次調用 select 前都要重新初始化描述符集,將 fd 從用戶態(tài)拷貝到內核態(tài),每次調用 select 后,都需要將 fd 從內核態(tài)拷貝到用戶態(tài);
  • 輪尋排查當文件描述符個數(shù)很多時,效率很低;

3、poll

poll:通過一個可變長度的數(shù)組解決了select 文件描述符受限的問題。數(shù)組中元素是結構體,該結構體保存描述符的信息,每增加一個文件描述符就向數(shù)組中加入一個結構體,結構體只需要拷貝一次到內核態(tài)。poll 解決了 select 重復初始化的問題。輪尋排查的問題未解決。

4、epoll

epoll:輪尋排查所有文件描述符的效率不高,使服務器并發(fā)能力受限。因此,epoll 采用只返回狀態(tài)發(fā)生變化的文件描述符,便解決了輪尋的瓶頸。

epoll 對文件描述符的操作有兩種模式:LT(level trigger)ET(edge trigger)。LT 模式是默認模式

LT模式

LT(level triggered)是缺省的工作方式,并且同時支持 block 和 no-block socket.在這種做法中,內核告訴你一個文件描述符是否就緒了,然后你可以對這個就緒的 fd 進行 IO 操作。如果你不作任何操作,內核還是會繼續(xù)通知你的。

ET模式

ET(edge-triggered)是高速工作方式,只支持no-block socket。在這種模式下,當描述符從未就緒變?yōu)榫途w時,內核通過 epoll 告訴你。然后它會假設你知道文件描述符已經(jīng)就緒,并且不會再為那個文件描述符發(fā)送更多的就緒通知,直到你做了某些操作導致那個文件描述符不再為就緒狀態(tài)了(比如,你在發(fā)送,接收或者接收請求,或者發(fā)送接收的數(shù)據(jù)少于一定量時導致了一個EWOULDBLOCK 錯誤)。但是請注意,如果一直不對這個fd作IO操作(從而導致它再次變成未就緒),內核不會發(fā)送更多的通知(only once)

ET 模式在很大程度上減少了 epoll 事件被重復觸發(fā)的次數(shù),因此效率要比LT模式高。epoll 工作在 ET 模式的時候,必須使用非阻塞套接口,以避免由于一個文件句柄的阻塞讀/阻塞寫操作把處理多個文件描述符的任務餓死。

3、LT 模式與 ET 模式的區(qū)別如下:

LT 模式:當epoll_wait檢測到描述符事件發(fā)生并將此事件通知應用程序,應用程序可以不立即處理該事件。下次調用epoll_wait時,會再次響應應用程序并通知此事件。

ET 模式:當epoll_wait檢測到描述符事件發(fā)生并將此事件通知應用程序,應用程序必須立即處理該事件。如果不處理,下次調用epoll_wait時,不會再次響應應用程序并通知此事件。

請問 C++11 有哪些新特性?

參考回答:

C++11 最常用的新特性如下:

  • auto 關鍵字:編譯器可以根據(jù)初始值自動推導出類型。但是不能用于函數(shù)傳參以及數(shù)組類型的推導
  • nullptr 關鍵字:nullptr 是一種特殊類型的字面值,它可以被轉換成任意其它的指針類型;而 NULL 一般被宏定義為 0,在遇到重載時可能會出現(xiàn)問題。
  • 智能指針:C++11 新增了std::shared_ptr、std::weak_ptr等類型的智能指針,用于解決內存管理的問題。
  • 初始化列表:使用初始化列表來對類進行初始化
  • 右值引用:基于右值引用可以實現(xiàn)移動語義和完美轉發(fā),消除兩個對象交互時不必要的對象拷貝,節(jié)省運算存儲資源,提高效率
  • atomic 原子操作用于多線程資源互斥操作
  • 新增 STL 容器 arra y以及 tuple

往期推薦




專輯 | 趣味設計模式
專輯 | 音視頻開發(fā)
專輯 | C++ 進階
專輯 | 超硬核 Qt
專輯 | 玩轉 Linux
專輯 | GitHub 開源推薦
專輯 | 程序人生


關注公眾「高效程序員」??,一起優(yōu)秀!

回復 “入群” 進技術交流群,回復 “1024” 獲取海量學習資源。
瀏覽 48
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 日韩高清成人无码| wwwAV在线观看| 日韩一级无码毛片| 超碰青娱乐| 欧洲一区二区三区| 一区二区三区四区在线看| 日韩精品网址| 骚白虎一区| 插菊花综合网2| 久草精品视频| 国产一级片电影| 午夜一本道| 亚洲AV无码成人精品区天堂小说| 黄色午夜福利| 亚洲涩情91日韩一区二区| 国内自拍视频网站| 亚洲视频在线观看中文字幕| 亚洲无码视频在线观看| 三级片在线观看视频| 福利视频二区| 免费无码一级A片大黄在线观看| 最新亚洲中文字幕| 一级操逼视频免费观看| 日韩Av无码一区二区三区不卡| 91日逼视频| 亚洲女人在线| 麻豆国产在线| 2019中文字幕mv第三季歌词| 午夜国产精品AV| 欧美久久久| 97人妻视频| 再深点好爽灬轻点久久国产 | 午夜免费福利视频| 国产換妻4P视频| 亚洲无码视频观看| 超碰777| 午夜精品久久久| 99国产在线观看免费视频| 狠狠色狠狠撸| 91福利视频网| 亚洲中文字幕av天堂| 91综合娱乐| 久久77| 欧美XXX黑人XYX性爽| 秘亚洲国产精品成人网站| 亚洲AV女人18毛片水真多| 中国人妻HDbute熟睡| 性色aV中文字幕| 亚洲色情电影| 日韩人妻无码一区| 日韩综合久久| 亚洲无码精品久久| 国产97在线视频| 日韩在线视频观看| 久艹久| 最近日本中文字幕中文翻译歌词| 成人福利| 天天玩夜夜玩天天玩国产99| 欧美+日韩+国产+成人+在线| 婷婷国产综合| 91亚洲欧美| 精品国产一二三区| 成人欧美在线| 黄色日逼网站| 成人精品在线观看| 欧美日韩一区二区三区四区 | 久久精品视频久久| 老熟女--91XX| 中文字幕国产AV| 日本a在线| 波多野结衣在线观看一区二区| 啪啪啪啪网站| 无码六区| 性无码一区二区三区| 无码人妻丰满熟妇啪啪| 亚洲精品天堂无码| 亚洲中文自拍| 国产婷婷色一区二区| 大香蕉久久| 五月AV| 久久逼逼| 99色| 亚洲天堂无码视频| 免费的AV| 亚州AV无码| 成人无码动漫A片| 欧美成人手机在线| 免费看成人A片无码照片88hⅤ| 自拍偷拍综合网| 国产成人精品av在线观看| 翔田千里中文字幕无码| 国产免费av在线| 人人爱久久| 无码视频免费播放| 婚闹不堪入目A片| 丁香五月天色婷婷| 国产免费激情视频| 人人操夜夜| 特级毛片AAAAAA蜜桃| 精品中文字幕在线播放| 国产一级a毛一级a做免费的视频l 精品国产免费观看久久久_久久天天 | 韩日在线视频| 亚洲精品国产AV婷婷| 波多野结衣av在线观看| 国产熟睡乱子伦午夜视频_第1集 | 69xx视频| 欧美夜夜骑| 成人高清无码在线观看| 天天免费视频| 久久99精品久久久久久水蜜桃| 俺去俺来也www色官网黑人| 亚洲色热| 欧美射精视频| 奇米97| 亚洲av毛片| 欧美在线v| 亚洲图片小说区| 精品亚洲无码视频| 亚洲色图另类| 综合国产| 69国产| 久久午夜无码鲁丝片| 男女无码视频| 九九国产精品| 影音先锋三级| a在线| 日韩一级A片| 综合色国产精品欧美在线| 中文字幕观看av| 中文字幕中文字幕一区| 久久99精品国产.久久久久| 亚洲精品成人av| 国产淫乱视频| 超碰91免费在线观看| 成人a电影| 在线观看中文字幕网站| 亚洲有码在线视频| 亚洲精品国产AV婷婷| 一本到在线视频| 91.www91成人影视在线观看91成人网址9 | 欧美性生交18XXXXX无码| 色欧美视频| 日韩精品一区在线| 国产AV中文| 狠狠干中文字幕| 国产精品夜夜爽7777777| 人人看人人做| 日本三级无码| 国产精品自拍视频| 撸一撸成人在线做爱视频。| 欧美综合网在线观看| 伊人久久大香色综合久久| 亚洲AV无码精品岛国| 亚洲操屄| 亚洲日逼网| 熟女人妻ThePorn| 日韩在线播放视频| 人人草人人操| 无码人妻丰满熟妇区毛片视频| 日韩A片在线观看| 国产91在线视频| 丁香婷婷色五月激情综合三级三级片欧美日韩国 | 怡春院欧美| 一级操逼毛片| 操婊网| 国产精品国产成人国产三级| 激情一区二区| 亚洲熟女一区二区三区妖精| 中文无码网站| 三区在线观看| 日韩毛片在线看| 成人a片视频| 成人a视频| 日本黄色免费看| AV在线免费播放| gay成人在线观看| 亚洲国产视频在线观看| 婷婷成人综合网| 久久久成人影片| 美女天天干| www.色悠悠| 精精品人妻一区二区三区| 在线黄网| 久久久国产精品人人片| 亚洲无码色婷婷| 日逼网站视频| 精品美女视频在线观看免费软件| 青青自拍视频| 91无码精品一区二区| 熟女视频国产| 国产av电影网| 亚洲大胆视频| 裸体美女视频欧美18| 黄色三级毛片| 久久黄色视频网站| 一道本一区二区三区免费视频| 西西444大胆无码视频| 高清无码内射视频| 天堂在线观看av| 久热福利| 久久精品视频18| 欧美一区| 五月天黄色电影网站| 中文无码一区二区三区四区| 91亚洲精品在线观看| 色吟AV| 国产无遮挡又黄又爽免费网站| 日韩综合色视频导航| 天天撸天天色| 日韩一区二区三区免费视频| 成人激情视频| 西西www444无码免费视频| 天天艹天天| 高清无码在线免费观看视频| 强开小嫩苞一区二区电影| 成人无码一区二区| 免费成人黄视频| 久久久无码AV| 特黄色视频| 国产无套内射在线观看| 亚洲无码动漫| 久草视频在线资源| 无码秘蜜桃一区二区三区| 国产久久在线观看| 啪啪国产| 国产亲子乱婬一级A片| 91国产视频网站| 黄片高清无码在线观看| 亚洲无码字幕| 天天爽天天操| 91麻豆天美传媒在线| 伊人伊人网| 99精品色| 乱子伦国产精品| 亚洲免费精品视频| 久草五月| 婷婷精品国产一区二区三区日韩| 日本黄色大片| 久久伊人中文字幕| 中文字幕乱伦视频| 伊人大综合| 日韩成人无码一区二区| 一区二区Av| 欧美在线一级片| h国产在线| 91伊人网| 人妻人人干| 亚洲秘无码一区二区三区| 中文字幕不卡视频| 二区无码| 国产精品精品| 人人鲁人人操| 五月天福利视频| 国产精品9999久久久久仙踪林| 豆花视频在线免费观看| 国产亚洲欧美精品综合在线| 瑟瑟视频在线观看| 人妻少妇被猛烈进入中文字幕 | 91在线精品秘一区二区黄瓜| 99久久综合国产精品二区| 日韩成人影视| 91AV在线看| AV天堂国产| 国产成人亚洲精品| 亚洲欧美日韩电影| 亚洲欧美日韩在线| 九色丨蝌蚪丨老版熟女| 免费日韩视频| 欧美精品久久久| 视频一区在线播放| 玖玖av| 青娱乐超碰在线| 中文字幕成人av| 色网站操逼| 成人午夜无码福利视频| 高清无码不卡av| 黄色A片免费| 蜜桃av在线| 三洞齐开Av在线免费观看| 懂色AV无码中字幕一区| 成人首页| 无码操逼| 午夜精品久久久久久久91蜜桃| 亚洲免费观看高清完整版在va线 | 白丝久久| 欧美老妇操逼视频| 亚洲69| 人人妻人人做| 插插插菊花综合网| 无码人妻一区二区三区| 五月婷婷俺也去| av青青草原| 91无码精品一区二区| WWWA级片| 肏屄视频免费| 少妇高潮视频| 国产中文字幕在线免费观看| 中文字幕在线日亚洲9| 日韩欧美在线观看| 国产乱╳╳AⅤ毛片| 激情久久婷婷| 天天干夜夜操熟女| 老湿机福利院| 亚州AV无码| 国产精品视频你懂的| 人人看人人色| 777在线视频| 亚洲无码理论片| 无码三| 日本少妇午夜福利| 亚洲三级电影在线观看| 一区二区三区高清无码| 夜夜爽夜夜爽| 欧美亚洲综合在线| 97超碰免费| 欧美老熟妇BBBBB搡BBB| 中文在线a√在线8| 天天爽爽爽爽爽成人片| 日韩操屄视频| 婷婷久久综合久色| av视屏| 精品视频久久久| 久久精品综合| 亚洲一本之道| 内射学生妹| AV在线资源观看| 九九黄片| 成人乱码一区二区三区| 99久久精品国产一区二区成人| 成人三区| 欧美亚洲视频在线观看| 日韩AV高清| 国产乱子伦-区二区| 麻豆久久久久| 欧美洲成人网站| 亚洲先锋影音| 日韩v| 国产操逼大全| 大香焦久久| 国产精品毛片| 成人社区视频| 操b视频在线免费观看| 亚洲涩情91日韩一区二区| 一级片日韩| 69久久成人精品| 精品区| 国产福利美女网站| 亚洲午夜在线观看| 天天舔| 日韩高清无码三级片| 人人摸人人爱| 激情久久AV一区AV二区AV三区| 色婷婷基地| 全国男人的天堂网站| 操逼一级| 国产精品国产三级国产专区52| 狠狠草狠狠干| 亚洲欧洲在线播放| 91视频专区| 黑人无码一二三四五区| 欧美性爱怡红院| 91超碰在线| 囯产精品久久久| 国产一级a| 欧美日韩国产免费观看成人片| 天天色av| 成人福利免费视频| 久久97人妻AⅤ无码一区| 麻豆亚洲AV成人无码久久精品| 亚洲无码成人电影| 欧美精品成人| 日韩无码黄色电影| 色香蕉视频在线观看| 欧美日韩大屌| 一区在线观看视频| 欧美午夜精品久久久久免费视| av片在线免费观看| 嫩BBB搡BBBB搡BBBB| 老熟女一区二区三区| 成人a片在线免费观看| 簧片网站在线观看| 国产精品爽爽久久久| 亚洲AV无码一区东京热久久| 一級免費网站| 日韩成人无码人妻| 精品人妻人人操| 在线观看无码高清| 欧洲精品在线免费观看| 亚洲成人视频免费观看| 亚洲精品日韩综合观看成人91 | 大香蕉久久久久| 久久一二三四| 黄片网站视频| 最新激情网站| 黄片大全免费看| 久久成人一区| 北条麻妃无码| 俺去也av| 国产精品秘久久久久久一两个一起| 国产午夜视频在线观看| 8050午夜| 蜜臀av在线播放| 午夜做爱福利视频| 激情伊人| 日本黄在线播放| 日韩AV综合| aaa国产精品| 欧美v在线| 中文字幕+乱码+中文乱码视频在线观看 | 亚洲精品乱码久久久久久按摩观| 欧美一级在线免费观看| 中文字幕淫乱视频欧美| 偷拍亚洲色图| 影音先锋成人资源| 无码秘蜜桃一区二区三区| 青青自拍视频| av资源播放| 国内自拍av| 精国产品一区二区三区A片| 亭亭五月丁香| 超碰1999| 一道本在线视频| 国产淫荡视频| 九色在线视频| 亚洲内射网| 色播婷婷五月天| 一级AV在线| 69无码| 懂色AV一区二区三区国产中文在线 | 日皮视频在线免费观看| 成人自拍网| 在线成人视频网站大香蕉在线网站| 麻豆传媒电影| 四季AV一区二区凹凸懂色桃花| 91人妻人人澡人人爽人人 | 一区免费视频| 成人在线H| 999精品视频| 少妇高潮在线| 中文字幕在线免费| 水蜜桃成人网| 99精品视频免费观看| 日本99视频| 日韩一级在线| 色综合久久天天综合网| 国产精品一色哟哟哟| 五月婷婷俺來也| 福利在线| 日韩性无码| 玩弄人妻少妇500系列视频 | 青青草成人AV| 国产免费无码一区二区| 撸一撸免费视频| 欧美视频精品| 精品日韩中文字幕| 亚洲天堂2017| 激情成人五月天| 欧美激情一区二区A片成人牛牛| 毛片毛片毛片| 97视频在线免费观看| 欧美AAA大片| 一级黄色片免费看| 日韩黄色在线视频| 亚洲成人精品在线观看| 真人BBwBBWBBw另类视频| 欧美亚洲成人精品| 丰满少妇一区二区三区| 日韩无码AV中文字幕| 日韩成人精品| 国产主播在线播放| P站免费版-永久免费的福利视频平台| 另类老妇奶性BBWBBw| 日韩V| 操逼视频看看| 黄色成人在线观看| 嫩BBB搡BBB槡BBB小号| 91就去干| 免费a在线观看| 久久久久无码国产精品不卡| 国产欧美日韩成人| 精品视频在线免费观看| 免费无码AV| 精品视频在线观看免费| 麻豆熟妇乱妇熟色A片在线看| 肏屄视频在线观看| 青青青草视频在线观看| 国产精久久| 午夜天堂网| 亚洲精品福利视频导航| 黄色成人网站在线观看| 亚洲精品成人视频| 丰满熟妇人妻无码视频| 亚洲91黄色片| 在线观看日本vs欧洲vs美洲| www.丁香五月| 大香蕉亚洲网| 大色欧美| 久草在在线| 美国一级A片草草视频| 青青久草| 激情国产视频| 99久久婷婷国产综合| 国产视频一区二区在线| 玉米地一级婬片A片| 91口爆| 69成人在线电影| 日韩在线视频网| 精品香蕉视频| 亚洲无码高清视频在线观看| 亚洲中文久久| 欧美日韩无| 人人操碰人人| 欧美日韩黄片| 午夜福利电影AV| 婷婷丁香人妻天天爽| 99在线视频免费观看| 欧美伦妇AAAAAA片| 免费观看A级毛片| 2025av中文字幕| jiujiuav| 日本无码在线视频| 手机看片欧美+日韩+国产| 无码中文暮| A片在线观看视频| 日本久久视频| 男女av在线| 丁香婷婷视频| 日韩精品一区二区在线观看| 日本视频精品| 91色视频在线观看| h网站在线观看| 中文字幕+乱码+中文乱码电影 | 国产精品不卡在线观看| 久久视频这里有精品| 婷婷色综合视频二区| 国产主播福利| 在线观看日韩av| 色五月婷婷五月| 操逼视频看看| 久久久久久久久久久久久自慰小片| 亚洲欧美在线观看视频| 午夜理伦| 日B免费视频| 操操插插| 大香蕉久久久| 在线观看黄片视频| 黄色在线免费观看网站| 亚洲高清无码视频大全| 亚洲va欧美va天堂v国产综合 | 婷婷九九| 国产成人精品av在线观看| henhengan| 国产成人精品视频免费看| 中文字幕h| 亚洲手机视频| wwwsesese| 麻豆91蜜桃传媒在线观看| 午夜福利大片| 99色色网| 少妇人妻无码| 中文字幕不卡无码| 露脸老熟女91集合| www.操逼网| 亚洲欧美在线一区| 视频国产区| 性v天堂| 一级黄色免费电影| 久久免费在线视频| 亚洲群交视频| AV婷婷在线| 精品国产乱码一区二区| 在线无码高清| 五月丁香大香蕉| 翔田千里無碼破解| 久久夜夜操| 少妇成人网| 人妻精品一区二区在线| 日韩不卡在线| 欧美精品在线播放| 亚洲视频成人| 老熟妇搡BBBB搡BBBB| 青青草在线观看视频| 一区二区中文| 人妻性爱| 91婷婷| 高h视频在线观看| 北条麻妃日B视频| 国产区欧美去区在线| 男女AV网站| 蝌蚪窝在线视频观看| 日本黄在线播放| 国产情趣网站| 国产成人精品在线观看| 自拍AV在线| 午夜高清视频| 97超碰在线播放| 亚洲在线免费视频| 婷婷操逼| 北条麻妃一区二区三区| 第一色影院| 免费a片在线观看| 伊人网视频| 西西444www无码精品| 亚洲成人色色| 俺去俺来也www色官网黑人| 91视频高清无码| 中文字幕五月天| 日韩毛片在线视频x| 中日美朝美女一级片免费看| 日韩一区二区三区四区| 人人摸人人艹| 97超碰人妻| 91亚洲免费| 99在线国产| 久草免费在线观看视频| 成人精品一区二区三区无码视频| 亚洲AV无码成人精品区h麻豆 | 天天射天天射| 成人毛片18女人毛片真水| 青娱乐成人电影| 国产成人久久777777| 天天干天天色天天射| 人妻少妇91精品一区黑人| 国产性爱网站| 丁香六月婷婷综合| 国产内射在线观看| 欧美一级一级| 91操B| 亚洲精品无码视频在线观看| 91在线无码精品秘国产-百度| 无码免费毛片一区二区三区古代| 蜜桃传媒一区二区亚洲A| 中文字幕乱伦视频| 一本色道久久综合亚洲怎么玩| 豆花视频成人网站入口免费观看| 黄色录像一级片| 天天干天天干天天| www.五月天婷婷| 国产香蕉视屏| 亚洲精品鲁一鲁一区二区三区| 欧美一级生活片| 天天视频黄| 国产成人综合视频| 日逼日逼日逼| AV无码在线免费观看| 色妞视频| 丁香婷婷激情五月| 男人天堂新地址| 国产在线观看91| 怡红院欧美| 精东av| 国产一区二区视频在线| 日韩日批视频| 一区二区三区无码专区| 懂色av懂色av粉嫩av| 欧美性综合网| 欧美成人免费观看| 9I成人免费版视频| 婷婷亚洲国产| 在线a视频免费观看| 91在线视频免费播放| jzzijzzij亚洲成熟少妇在线观看| 无遮挡动态图| 亚洲成人视频一区二区| 午夜福利AV电影| 91AV在线观看视频| 国产免费AV片在线无码| 国产主播一区二区| 99热官网| 无套内射在线| 四虎成人在线| av六月天| 粉嫩小泬粉嫩小泬在线| 日本一级黄色A片| a久久| 国产成人AV免费无码| 亚洲国产成人精品午夜| 国产美女福利| 中文视频在线观看| 美女在线扣穴| 日韩成人影视| 亚洲日韩第一页| 97人妻碰碰中文无码久热丝袜| 日本亚洲国产| jizz在线观看| 成人AV一AV二| 国产香蕉在线播放| 五月婷网| 国产精品男女| 人妻少妇综合| 亚洲大胆视频| 天天综合在线观看| 亚洲自慰| 亚洲性爱小说| 欧美另类色| 日本激情视频| 91啪啪视频| 日韩成人在线播放| 亚洲人BBwBBwBBWBBw| 波多野结衣一区| 麻豆传媒在线观看| 91迷奸| 污污污污污www网站免费民国| 97色在线视频| WWW亚洲视频| 亚洲爱爱网站| 操日本女人逼| 欧美日韩性爱网站| 男女啪啪免费视频| AV中文字幕网| 日韩无码一区二区三区四区| 黄页网站在线免费观看| 操人妻视频| 无码秘蜜桃一区二区| 国产欧美日本视频| 高清毛片AAAAAAAAA片| 影音先锋久久久久AV综合网成人| 五十路熟妇| 一级a片免费| 狠狠色五月亚洲91| 五月天婷婷激情网| 黄色视频网站国产| 大香焦久久| 激情91| 翔田千里无码| www.怡春院| 婷婷五月天成人社区| 色综合天| 男女乱伦视频| 美女大香蕉| 欧美日韩免费一区二区三区| 无码婷婷| 少妇做爱视频| 女人自慰网站在线观看| 蜜乳AV一区二区三区| 狠狠91| 国产精品永久久久久久久久久| 自拍视频网| 久久久穴| 欧美综合激情| 国产激情无码| 激情乱伦网| 免费av中文字幕| 午夜福利澳| 青娱乐偷拍视频| 91小视频在线观看| 日韩欧美在线视频观看| 91熟女视频| 日韩在线1| 国产有码在线观看| 人人干视频| 日韩av在线电影| 日本色色网站| 天天日天天色| 人妻电影亚洲av| 亚洲无码人妻一区| 成年人免费毛片| 国产成人影视在线观看| 亚欧洲精品| 亚洲欧洲中文字幕| 操b网站| 中文字幕乱码亚洲无线码按摩| 噼里啪啦免费观看视频大全| 欧美在线视频a| 国产香蕉精品视频| 91在线日韩| 亚洲免费高清| 香蕉网站操逼片| 欧美日韩一级黄色片| 国产乱子伦无码视频免费| 丰满岳乱妇一区二区三区全文阅读| 图片区小说区区亚洲五月| 91久久欧美极品XXXXⅩ| 91麻豆免费看| 国产精品7777| 波多野结衣一二三区| 操逼网首页| 日韩黄色小说| 91性爱| 国产成人在线精品| AV五月| 亚洲一区三区| 一区二区三区四区无码视频| 91熟女视频| 日本v片| 亚洲免费成人电影| 亚洲小说区图片区都市| 豆花视频成人| 欧美18禁黄免费网站| 无码三级在线播放| 日本内射在线播放| 欧美群交在线观看| 国产福利AV| 欧美日本一区二区三区| A免费在线观看| 嫩苞又嫩又紧AV无码| 中文字幕不卡在线观看| 浪潮在线观看完整版| 麻酥酥在线视频| 好吊顶亚洲AV大香蕉色色| 五月婷亚洲精品AV天堂| 一本大道东京热av无码| 91香蕉在线观看视频在线播放| 天天夜夜久久| 中文在线字幕免费观| 制服丝袜强奸乱伦| 天美果冻麻豆国产一区| 夜夜操夜夜撸| 日韩无码中文字幕视频| www.男人天堂| 91av在线播放| 97色碰| 亚洲无码视频看看| 毛片在线观看网站| 亚洲天堂在线观看视频| 国产成人精品一区二区三区四区| 亚洲GV成人无码久久精品| 91网站免费看| 九九色综合| 国产一区视频18| 午夜天堂精品久久久| 国产黄片网站| 五夜福利成人视频| 爱射网| 久9视频| 免费性爱视频网站| 免费黄片无码| 91人妻人人澡人人添人人爽| 亚洲综合色色| 色婷婷丁香| 无遮挡动态图| 操比视频在线观看| 特级西西444www高清| 日本久久人体视频| 免费黄色一级视频| 亚洲三级片在线| 玖玖在线视频| 亚洲欧美成人| 色综合天天操| 国产精品AV在线| 无码免费中文字幕| 日本一级特黄大片AAAAA级 | 啊啊啊网站| 日韩视频一级| 亚洲黄色在线观看视频| 欧美人妻精品| 久久高清免费视频| 日韩免费性爱视频| 麻豆md0049免费| 日韩性爱网| 五月丁香视频在线| 亚洲人成人无码一区二区三区| 欧美视频免费在线观看| AV性爱社区| 黄色av免费网站| 狼友无码| 一级操逼黄色视频| 中文字幕av网| 日本一区二区视频| 亚洲日色| 日日骚影院| 91精品免费视频| 久草福利| 欧美深夜福利视频| 丰满人妻一区二区| 无码国产精品一区二区三| 久久久久亚洲AV无码专区成人| 国产男女无套免费视频| 波多野结衣AV无码| 影音先锋麻豆传媒| 爽妇综合网| 黄色电影免费在线观看| 欧美V亚洲| 亚洲精品成AV人片天堂无码 | 成人亚洲性情网站www在线| 蜜桃AV无码一区二区三区| 苍井空一区二区| 安徽妇搡BBBB搡BBB| 亚洲欧美影院| 五月天激情婷婷| 少妇AAA级久久久无码精品片| 伊人大香蕉综合在线| 色妹子综合| 99热在线观看者| 国产日韩在线观看视频| 久操视频在线| 大香蕉草久| 国产激情| 豆花网无码视频观看| 国产又大又粗又黄| 強姧伦一区二区三区在线播放| 狼友视频在线看| 一级成人毛片| AV无码在线观看| 精品一区二区三区四区五区六区七区八区九区| 精品在线第一页| 午夜做爱福利视频| www.日韩av| 偷拍综合网| 欧美三级性爱视频|