日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

muduo C++网络库的学习笔记

發布時間:2024/3/7 c/c++ 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 muduo C++网络库的学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 10.3.C++鏈接linking
    • 10.3.2 inline函數
    • 10.3.3 模板
    • 10.3.4 虛函數
  • 10.4 工程項目中頭文件的使用規則
    • 10.4.2 頭文件的使用規則
  • 11.1 樸實的C++設計
  • 11.2 程序庫的二進制兼容性
  • 11.3 避免使用虛函數作為庫的接口
  • 11.4 動態庫接口的推薦做法
  • 11.5 std::function和std::bind取代虛函數
    • 11.5.1基本用途
    • 11.5.2 對程序庫的影響
    • 11.5.5 對面向對象程序設計的影響
  • 11.6 iostream的用途與局限
    • 11.6.1 stdio格式化輸入輸出的缺點
    • 11.6.2 iostream設計初衷
    • 11.6.3 iostream與標準庫其他組件的交互
    • 11.6.4 iostream在使用方面的缺點
    • 11.6.5 iostream在設計方面的缺點
    • 11.6.6 一個300行的memory buffer output stream
    • 11.6.7 現實中的C++程序如果做文件IO
  • 11.7 值語義與數據抽象
    • 11.7.1 什么是值語義
    • 11.7.2 值語義與生命期
    • 11.7.3 值語義與標準庫
    • 11.7.4 值語義與C++語言
    • 11.7.5 什么是數據抽象
    • 11.7.6 數據抽象所需的語言措施
    • 11.7.7 數據抽象的例子
  • 12 C++經驗談
    • 12.1 用異或來交換變量是錯誤的
    • 12.2 不要重載全局::operator new()
      • 12.2.1 內存管理的基本要求
      • 12.2.2 重載::operator new()的理由
      • 12.2.3 ::operator new()的兩種重載方式
      • 12.2.4 現實的開發環境
      • 12.2.5 重載::operator new()的困境
      • 12.2.6 解決辦法:替換malloc
      • 12.2.7 為單獨的class重載::operator new()有問題嗎?
      • 12.2.8 有必要自行定制內存分配器嗎?
    • 12.3 帶符號整數的除法與余數
    • 12.4 在單元測試中mock系統調用
      • 12.4.1 系統函數的依賴注入
      • 12.4.2 鏈接器墊片link seam
    • 12.5 慎用匿名namespace
      • 12.5.1 C語言的static關鍵字的兩種用法
      • 12.5.2 C++語言的static關鍵字的四種用法
      • 12.5.3 匿名namespace的不利之處
    • 12.6 采用有利于版本管理的代碼格式
      • 12.6.1 對diff友好的代碼格式
      • 12.6.2 對grep友好的代碼風格
      • 12.6.3 一切為了效率
    • 12.7 再探std::string
      • 12.7.1 直接拷貝eager copy
      • 12.7.2 寫時賦值copy on write
      • 12.7.3 短字符串優化
    • 12.8 用STL algorithm輕松解決算法面試題

10.3.C++鏈接linking

10.3.2 inline函數

inline關鍵字在源文件中不是必須的,編譯器可以自動判斷;
inline在頭文件中還是需要的,可以防止鏈接器重復定義(multipe definition);

然后判斷一個C++可執行文件是debug build還是release build?即判斷:一個可執行文件是-O0編譯的還是-O2編譯的?

  • eg:
#include <cstdio> #include <cmath> #include "printer.h" #include <vector>int main() {std::vector<int> vi;printf("%zd\n", vi.size());return 0; }

my_course/course/12/01_math/01/run.sh

#!/bin/bash set -erm -rf build cmake -B build cmake --build build

my_course/course/12/01_math/01/CMakeLists.txt

cmake_minimum_required(VERSION 3.15) project(hellocmake)add_executable(main main.cpp)
  • 測試:

debug

wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ g++ -Wall main.cpp wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ nm ./a.out |grep size|c++filt 000000000000142c W std::vector<int, std::allocator<int> >::size() const

release

wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ g++ -Wall -O2 main.cpp wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ nm ./a.out |grep size|c++filt

10.3.3 模板

  • my_course/course/12/01_math/01/Request.h
class PrintRequest {int m_user_d_;public:int getUserId() const { return m_user_d_; } };class ScanRequest {int m_userId_;public:int getUserId() const { return m_userId_; } };
  • my_course/course/12/01_math/01/Printer.h
#include "Request.h"class PrintRequest; class ScanRequest;class Printer {// 模板函數解析request公共部分// 實現放在源文件中,好處:Printer的用戶看不到decodeRequest函數模板的定義,也可以加快編譯速度template <typename REQ>void decodeRequest(const REQ &req);void processRequest();int m_currentRequestUserId_;public:void onRequest(const PrintRequest &req);void onRequest(const ScanRequest &req); };
  • my_course/course/12/01_math/01/Printer.cc
#include "Printer.h" #include "Request.h"// 現在編譯器能給看到decodeRequest的定義,也就能給具體化 template <typename REQ> void Printer::decodeRequest(const REQ &req) {m_currentRequestUserId_ = req.getUserId();// decode other parts }void Printer::onRequest(const PrintRequest &req) {decodeRequest(req);processRequest(); } void Printer::onRequest(const ScanRequest &req) {decodeRequest(req);processRequest(); }

C++11 extern template特性

  • 阻止隱式模板具體化,使得std::string和std::
#include <cstdio> #include <cmath> // #include "printer.h" #include <vector> #include <string> #include <iostream>using namespace std;int main() {// std::vector<int> vi;// printf("%zd\n", vi.size());string name;cin >> name;cout << "hello, " << name << endl;return 0; } 目標文件,并沒有具體化iostream和string的兩個大模板 wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ nm build/main |grep " [TW]" 0000000000001410 T __libc_csu_fini 00000000000013a0 T __libc_csu_init 0000000000001418 T _fini 0000000000001180 T _start 0000000000004000 W data_start 0000000000001269 T main wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ man nm而是引用了標準庫中的實現 wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ nm build/main |grep -o " U .*"U _Unwind_Resume@@GCC_3.0 是string的構造函數與析構函數U _ZNSolsEPFRSoS_E@@GLIBCXX_3.4U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev@@GLIBCXX_3.4.21U _ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev@@GLIBCXX_3.4.21U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4U _ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21U _ZStrsIcSt11char_traitsIcESaIcEERSt13basic_istreamIT_T0_ES7_RNSt7__cxx1112basic_stringIS4_S5_T1_EE@@GLIBCXX_3.4.21U __cxa_atexit@@GLIBC_2.2.5U __gxx_personality_v0@@CXXABI_1.3U __libc_start_main@@GLIBC_2.2.5U __stack_chk_fail@@GLIBC_2.4

10.3.4 虛函數

每個多態class都有一份vtable

  • 定義或者繼承了虛函數的對象中會有一個隱含成員:指向vtable的指針vptr
  • 在構造和析構對象的適合,編譯器生成的代碼會修改這個vptr成員,會用到vtable的定義(使用其他地址
  • eg:
#include <cstdio> #include <cmath> // #include "printer.h" #include <vector> #include <string> #include <iostream>using namespace std;class Base { public:virtual ~Base();virtual void doIt(); };int main() {Base *b = new Base();b->doIt();return 0; }
  • 測試:出現這種錯誤的根本原因是:程序中某個虛函數沒有定義。雖然報錯顯示:找不到虛函數表的定義
[ 50%] Building CXX object CMakeFiles/main.dir/main.cpp.o [100%] Linking CXX executable main /usr/bin/ld: CMakeFiles/main.dir/main.cpp.o: in function `Base::Base()': main.cpp:(.text._ZN4BaseC2Ev[_ZN4BaseC5Ev]+0xf): undefined reference to `vtable for Base' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/main.dir/build.make:97: main] Error 1 make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/main.dir/all] Error 2 make: *** [Makefile:91: all] Error 2

10.4 工程項目中頭文件的使用規則

頭文件通常分為:C語言系統頭文件,C++標準庫頭文件,C++第三方庫頭文件,本公司的基礎庫頭文件,本項目的頭文件

10.4.2 頭文件的使用規則

  • eg:查找頭文件包含的小技巧。eg:一個程序只包含了<iostream>,但是卻能使用std:string,這個<string>是如何被引入的?
// #include <cstdio> // #include <cmath> // #include "printer.h" // #include <vector> // #include <string> #include <iostream>using namespace std;// class Base // { // public: // virtual ~Base(); // virtual void doIt(); // };int main() {// Base *b = new Base();// b->doIt();// std::cout << sizeof(Base) << std::endl;std::string s = "wangji";return 0; } wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ cat >string #wangji wangji wangji@DESKTOP-QNG23J0:~/test/test/my_course/course/12/01_math/01$ g++ -M -I . main.cpp In file included from /usr/include/c++/9/bits/locale_classes.h:40,from /usr/include/c++/9/bits/ios_base.h:41,from /usr/include/c++/9/ios:42,from /usr/include/c++/9/ostream:38,from /usr/include/c++/9/iostream:39,from main.cpp:6:

11.1 樸實的C++設計

11.2 程序庫的二進制兼容性

11.3 避免使用虛函數作為庫的接口

11.4 動態庫接口的推薦做法

1.暴露的接口里面不要有虛函數,要顯式聲明構造函數、析構函數,并且不能inline

  • graphics.h
class Graphics { public:Graphics();~Graphics();void drawLine(int x0, int y0, int x1, int y1);private:class Impl;std::unique_ptr<Impl> impl; };

2.這部分代碼位于so中,隨著庫的升級一起變化
graphics.cc

#include "graphics.h"class Graphics::Impl { public:void drawLine(int x0, int y0, int x1, int y1); };//編譯器可以看到Impl的定義,編譯通過 Graphics::Graphics() : impl(new Impl) {}//析構函數是空的,也必須放到這里定義。 Graphics::~Graphics() {}void Graphics::drawLine(int x0, int y0, int x1, int y1) {impl->drawLine(x0, y0, x1, y1); }

3.增加新的功能,不必通過繼承的方式,就可以原地修改,容易保持二進制兼容性
graphics.h

#include <memory>class Graphics { public:Graphics();~Graphics();void drawLine(int x0, int y0, int x1, int y1);// 新增的非虛函數不影響現有的可執行文件void drawLine(double x0, double y0, double x1, double y1);private:class Impl;std::unique_ptr<Impl> impl; };

graphics.cc

#include "graphics.h"class Graphics::Impl { public:void drawLine(int x0, int y0, int x1, int y1);void drawLine(double x0, double y0, double x1, double y1); };//編譯器可以看到Impl的定義,編譯通過 Graphics::Graphics() : impl(new Impl) {}//析構函數是空的,也必須放到這里定義。 Graphics::~Graphics() {}void Graphics::drawLine(int x0, int y0, int x1, int y1) {impl->drawLine(x0, y0, x1, y1); }void Graphics::drawLine(double x0, double y0, double x1, double y1) {impl->drawLine(x0, y0, x1, y1); }

pimpl C語言的庫同樣可以用,eg:libevent2中的struct event_base

  • 為什么非虛函數比虛函數更健壯?
    因為虛函數是虛表指針+offset來決定虛函數的,而非虛函數是通過名字找到對應的函數的

11.5 std::function和std::bind取代虛函數

11.5.1基本用途

#include <functional> #include <string>class Foo { public:void methodA();void methodInt(int a);void methodString(std::string const &str); };class Bar { public:void methodB(); };void main() {// 無參,無返回值std::function<void()> f1;std::function<void(int)> f2;Foo foo;f1 = std::bind(&Foo::methodA, &foo);f1();Bar bar;f1 = std::bind(&Bar::methodB, std::ref(bar));f1();f1 = std::bind(&Foo ::methodInt, &foo, 42);f1();f1 = std::bind(&Foo::methodString, &foo, "hello");f1(); //調用foo.methodString("hello")// 要留意bind的實參(const char*)的生命期,她不應該短于f1的生命期// 必要時,可通過f1 = std::bind(&Foo::methodString, &foo, "hello”_s);來保證安全f2 = std::bind(&Foo::methodInt, &foo, std::placeholders::_1);f2(53); }

11.5.2 對程序庫的影響

程序庫的設計不應該給使用者帶來不必要的耦合限制,而繼承是第二強的一種耦合,最強的耦合是友元;

常規OO設計:虛函數+派生覆寫;

基于std::function的設計:以std::function作為接口

  • eg:線程庫
#include <functional> #include <string>// 一個基于std::function的Thread class基本數據結構 class Thread { public:using ThreadCallback = std::function<void()>;Thread(ThreadCallback const &cb) : cb_(cb) {}void start(){// somae magic to call run() in new created thread}private:ThreadCallback cb_;void run(){cb_();} };// 使用方式:不需要繼承 class Foo { public:void runInthread();void runInAnotherThread(int); };void main() {Foo foo;Thread thread1(std::bind(&Foo::runInthread, &foo));Thread thread2(std::bind(&Foo::runInAnotherThread, &foo, 100));thread1.start();thread2.start(); }
  • eg:網絡庫
#include <functional> #include <string>// network library class Connection; class NetServer { public:typedef std::function<void(Connection *)> ConnectionCallback;typedef std::function<void(Connection *, const void *, int len)> MessageCallback;NetServer(std::uint16_t port);~NetServer();void registerConnectionCallback(ConnectionCallback const &);void registerMessageCallback(MessageCallback const &);void sendMessage(Connection *, const void *buf, int len);void run(); };// 以std::function作為橋梁 // user code class EchoService { public:// 符合NetServer::sendMessage原型using SendMessageCallback = std::function<void(Connection *, const void *buf, int len)>;EchoService(const SendMessageCallback &sendMsgCb) : sendMessageCb_(sendMsgCb) {}// 符合NetServer::ConnectionCallback原型void onConnection(Connection *conn){printf("");}// 符合NetServer::MessageCallback原型void onMessage(Connection *conn, const void *buf, int size){sendMessageCb_(conn, buf, size); // echo back}private:SendMessageCallback sendMessageCb_; };// 上帝:把各種部件拼接起來 int main() {NetServer server(7);EchoService echo(std::bind(&NetServer::sendMessage, &server, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));server.registerConnectionCallback(std::bind(&EchoService::onConnection, &echo, std::placeholders::_1));server.registerMessageCallback(std::bind(&EchoService::onMessage, &echo, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));server.run(); }

11.5.5 對面向對象程序設計的影響

用std::function代替虛函數,OO設計模式:行為模式、Factory Method創建型模式、Stratery模式、Command模式、Template Method等都可以不用了

  • 以上述EchoService為例,EchoService需要一個函數原型滿足SendMessageCallback的東西來發送消息,而并不關心數據發送到網絡上還是Mock上

面向對象的接口與實現分離:

先寫一個AbstructDataSink interface,包含sendMessage()這個虛函數,然后派生出兩個class:NetDataSink和MockDataSink;
EchoService的構造函數應該以AbstructDataSink*為參數

基于對象的接口與實現分離:

直接傳入一個SendMessageCallback對象

什么時候使用繼承?
OO中的public繼承,即為了實現接口與實現分離,muduo只會在派生類的數目和功能完全確定的情況下使用;

  • eg:IO multiplexing在不同操作系統下不同有不同的實現方法,數目固定,且功能完全確定。用多態來代替switch-case可以達到簡化代碼的目的;

11.6 iostream的用途與局限

11.6.1 stdio格式化輸入輸出的缺點

#include <stdio.h> #define __STDC_FORMAT_MACROS #include <inttypes.h> #include <iostream>int main() {//緩沖區溢出危險:輸入的name沒有指定大小// char name[80];// scanf("%s\n", name);// // 安全做法:// constexpr int max_name = 80;// char myname[max_name];// char fmt[10];// sprintf(fmt, "%%%%ds", max_name - 1);// scanf(fmt, name);// int64_t在32bit和64bit平臺上是不同的類型int64_t x = 100;printf("%" PRIo64 "\n", x); //輸出的是8進制printf("%06" PRIo64 "\n", x);std::cout << std::dec << x << std::endl;// 等價于printf("%""ld""\n",x); // 64bit OSprintf("%""lld""\n",x); // 32bit OS// 等價于// printf("%ld\n", x); // 64bit OS// printf("%lld", x); // 32bit OSstd::size_t i = 1;printf("%zd\n", i);return 0; }

11.6.2 iostream設計初衷

#include <ostream> #include <iostream>class Date { public:Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}void writeTo(std::ostream &out) const{out << year_ << "-" << month_ << "-" << day_;}friend std::ostream &operator<<(std::ostream &out, const Date &date){out << date.year_ << date.month_ << date.day_ << std::endl;}private:int year_;int month_;int day_; };std::ostream &operator<<(std::ostream &out, const Date &date) {date.writeTo(out);return out; }int main() {Date date{2022, 11, 3};std::cout << date << std::endl;return 0; }

11.6.3 iostream與標準庫其他組件的交互

11.6.4 iostream在使用方面的缺點

#include <ostream> #include <iostream> #include <iomanip> //操作子格式化需要該頭文件 class Date { public:Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}// 輸出2022-11-03// iostream輸出格式繁瑣void writeTo(std::ostream &out) const{out << year_ << "-"<< std::setw(2) << std::setfill('0') << month_ << "-"<< std::setw(2) << std::setfill('0') << day_;}void writeTo(std::ostream &out){out << year_ << "-" << month_ << "-" << day_;char buf[32];snprintf(buf, sizeof(buf), "%d-%02d-%02d", year_, month_, day_);out << buf;}private:int year_;int month_;int day_; };std::ostream &operator<<(std::ostream &out, const Date &date) {date.writeTo(out);return out; }int main() {Date date{2022, 11, 3};std::cout << date << std::endl;const char *name = "wangji";int age = 30;// 注:數字表示替換字符串中要替換的位置,若一個字符串要替換兩個int類型,在替換位置分別 寫%1$d和%2$d.printf("My name is %1$s, I am %2$d years old.\n", name, age);std::cout << "My name is " << name << ", I am " << age << " years old." << std::endl;// 將整數轉為十六進制,會持續影響ostream的狀態int x = 8888;std::cout << std::hex << x << std::endl; // 0x22b8std::cout << 123 << std::endl; // 0x7bdouble d = 123.45;// C風格的格式輸出都不會影響,很舒服// 一般情況考慮用snprintf()打印到棧上緩沖,再用ostream輸出// stdio函數時線程安全的,iostream不是線程安全的:cout.operator<<(a).operator<<(b)兩次調用期間可能會被打斷,造成輸出不連續// fprintf(stdout, "%s %d", a, b);打印的內容不會受其他線程影響printf("\n%8.3f\n", d);std::cout << d << std::endl;using namespace std;cout << d << endl;// setprecision會影響后續輸出的精度,setw則不會cout << setw(8) << fixed << setprecision(3) << d << endl;cout << d << endl;return 0; }

總結

輸入:istream不適合輸入帶格式的數據;推薦做法:std::getline讀入一行數據到std::string,然后用正則表達式判斷正誤,并作分組,最后用strtod,strtol,或者std::string相關函數做類型轉換

輸出:ostream僅做簡單的無格式輸出

不要用ostream來寫log
ostringstream會動態分配內存,不適合性能較高的場合

文件IO,如果用作文本文件的輸入或者輸出,fstream也有上述的缺點
iostream在某些場合比stdio快,某些又慢,對于高性能而言,需自己實現字符串轉換

11.6.5 iostream在設計方面的缺點

面向對象中的public繼承需要滿足Liskov替代原則,就是OO繼承強調的是可替代性,派生類的對象可以替換基類對象;
只有真正的is-a關系采用public繼承,其他均以組合替代;

11.6.6 一個300行的memory buffer output stream

LogStream接口定義見muduo

其他程序如何使用LogStream作為輸出呢?

#include <ostream> #include <iostream> #include <iomanip> //操作子格式化需要該頭文件 class Date { public:Date(int year, int month, int day) : year_(year), month_(month), day_(day) {}// 輸出2022-11-03// iostream輸出格式繁瑣void writeTo(std::ostream &out) const{out << year_ << "-"<< std::setw(2) << std::setfill('0') << month_ << "-"<< std::setw(2) << std::setfill('0') << day_;}template <typename OStream>void writeTo(OStream &out){out << year_ << "-" << month_ << "-" << day_;char buf[32];snprintf(buf, sizeof(buf), "%d-%02d-%02d", year_, month_, day_);out << buf;}private:int year_;int month_;int day_; };template <typename OStream> OStream& operator<<(OStream& out, const Date &date) {date.writeTo(out);return out; }

11.6.7 現實中的C++程序如果做文件IO

在C++項目中,自己寫個File class,把項目用到的文件IO功能簡單封裝一下,通常就能滿足需要。

11.7 值語義與數據抽象

11.7.1 什么是值語義

指的是對象的拷貝與原對象無關,就像拷貝int一樣,eg:

  • C++內置類型bool、int、double、
  • 標準庫:pair<>、vector<>、map<>、string

對象語義:對象拷貝是禁止的,eg:

  • muduo的Thread的拷貝是禁止的,因為Thread代表一個線程,拷貝一個Thread對象并不能讓系統增加一個一模一樣的線程

11.7.2 值語義與生命期

  • eg:若Parent擁有Child,Child的生命期由其Parent控制
#include <memory> class Parent;class Child { public:explicit Child(Parent *myParent) : myParent_(myParent) {}private:Parent *myParent_; };class Parent { public:Parent() {}private:std::unique_ptr<Child> myChild_; };

采用std::shared_ptr寫法:

#include <memory> class Parent; using ParentPtr = std::shared_ptr<Parent>;class Child { public:explicit Child(const ParentPtr &myParent) : myParent_(myParent) {}private:std::weak_ptr<Parent> myParent_; };using ChildPtr = std::shared_ptr<Child>; class Parent : public std::enable_shared_from_this<Parent> { public:Parent() {}void addChild(){myChild.reset(new Child(shared_from_this()));}private:ChildPtr myChild; };int main() {ParentPtr p(new Parent());p->addChild(); }
  • eg:Child持有mom和dad的parents,一個parent持有一個或者多個child;mom知道她的配偶spouse,dad知道她的配偶spouse
#include <memory> #include <vector> // 如哦不使用智能指針,用C++做面向對象編程會困難重重 class Parent; using ParentPtr = std::shared_ptr<Parent>;class Child { public:explicit Child(const ParentPtr &mom, const ParentPtr &dad) : myMom_(mom), myDad_(dad) {}private:std::weak_ptr<Parent> myMom_;std::weak_ptr<Parent> myDad_; };using ChildPtr = std::shared_ptr<Child>; class Parent { public:Parent() {}void addChild(const ChildPtr &child){myChildren.push_back(child);}void setSpouse(const ParentPtr &spouse){mySpouse = spouse;}private:std::vector<ChildPtr> myChildren;std::weak_ptr<Parent> mySpouse; };int main() {ParentPtr mom(new Parent());ParentPtr dad(new Parent());mom->setSpouse(dad);dad->setSpouse(mom);{ChildPtr child(new Child(mom, dad));mom->addChild(child);dad->addChild(child);}{ChildPtr child(new Child(mom, dad));mom->addChild(child);dad->addChild(child);} }

11.7.3 值語義與標準庫

C++編譯器會為class默認提供copy constructor和assignment operator,所以在寫一個C++ class的時候,讓他默認繼承boost::noncopyable,幾乎總是正確的。

11.7.4 值語義與C++語言

C++的設計初衷是讓用戶定義的類型class能像內置類型int一樣工作。

11.7.5 什么是數據抽象

數據抽象data abstraction是與面向對象object oriented并列的一種編程范式。

11.7.6 數據抽象所需的語言措施

11.7.7 數據抽象的例子

12 C++經驗談

12.1 用異或來交換變量是錯誤的

  • eg:將“12345”反轉為“54321”
// C void reverse(char *str, int n) {char *begin = str;char *end = str + n - 1;while (begin < end){auto tmp = *begin;*begin = *end;*end = tmp;begin++;--end;} }// C++ void reverse_by_std(char* str, int n) {std::reverse(str,str+n); }

12.2 不要重載全局::operator new()

12.2.1 內存管理的基本要求

既不重復delete,也不漏掉delete

12.2.2 重載::operator new()的理由

12.2.3 ::operator new()的兩種重載方式

//方式1 #include <new> void *operator new(size_t size); void operator delete(void *p);//方式2 void *operator new(size_t size, const char *file, int line); void operator delete(void *p, const char *file, int line);Foo *p = new (__FILE, __LINE__) Foo;

12.2.4 現實的開發環境

12.2.5 重載::operator new()的困境

12.2.6 解決辦法:替換malloc

12.2.7 為單獨的class重載::operator new()有問題嗎?

12.2.8 有必要自行定制內存分配器嗎?

重載::operator new()或許在某些臨時的場合能應急,但是不應該作為一種策略來使用。
如果需要,可以從malloc層面入手,徹底替換內存分配器。

12.3 帶符號整數的除法與余數

12.4 在單元測試中mock系統調用

12.4.1 系統函數的依賴注入

方法1:
采用傳統的面向對象的手法,借助運行期的遲綁定實現注入與替換。自己寫一個System interface,把程序里面的open,close,write等函數用虛函數封裝一層。

方法2:采用編譯器或者鏈接期的遲綁定,因此程序只會用到一個implementation object,為此虛函數調用的代價有些不值得。(與系統調用相比,虛函數這點開銷可以忽略不計)。

  • 在一個system namespace頭文件,在其中聲明read()和write()等普通函數,然后在.cc文件里轉發給對應系統函數::read()和::write()。
  • 無需用到虛函數,代碼寫起來也比較簡潔,只用前綴sockets::即可。
// real:SocketsOps.h namespace sockets {int connect(int port, const struct sockaddr_in &addr); }// real:SocketsOps.cc int sockets::connect(int port, const struct sockaddr_in &sockaddr) {return ::connect(port, sockaddr_cast(&addr), sizeof(addr)); } // 編譯普通程序 g++ main.cc mynetcat.cc SocketsOps.cc - o mynetcat// stub:單元測試,MockSocketsOps.cc int sockets::connect(int port, const struct sockaddr_in &sockaddr) {errno = EAGIN;return -1; } // 編譯單元測試 g++ main.cc mynetcat.cc MockSocketsOps.cc - o mynetcat

12.4.2 鏈接器墊片link seam

  • 一開始沒有考慮單元測試,如何注入mock系統調用?
// 在鏈接時,會優先采用我們自己定義的函數 connect_func_t connect_func = dlsym(RTDL_NEXT, "connect");bool mock_connect; int mock_connect_errno; // mock connectextern "C" int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) {if (mock_connect){errno = mock_connect_errno;return errno == 0 ? 0 : -1;}else{return connect_func(sockfd, addr, addrlen);} }

12.5 慎用匿名namespace

一些小的helper函數會放到匿名namespace中

12.5.1 C語言的static關鍵字的兩種用法

函數內的靜態變量

  • 使用靜態變量的函數是不可重入的,也不是線程安全的

函數體之外修飾變量或者函數

  • 僅對本文件可見
  • 匿名namespace可以達到相同的效果

12.5.2 C++語言的static關鍵字的四種用法

除了以上C語言的兩種用法,有定義了兩種新用法:

  • 修飾class的數據成員
  • 修飾class的成員函數

12.5.3 匿名namespace的不利之處

anon.cc

namespace {void foo() {} } // namespaceint main() {foo(); }

anonlib.cc

namespace {void foo() {} } // namespace

上述兩個文件都定義了匿名空間中的foo()函數,那么gdb則無法區分這兩個函數

  • 匿名namespace中的函數是weak text,鏈接的時候若發生重名,linker不會報錯
g++ -g anon.cc anonlib.cc (gdb) b ' (anonymous namespace)::foo() __cxa_finalize@plt _fini _start anonlib.cc frame_dummy main() __cxa_finalize __do_global_dtors_aux _init anon.cc deregister_tm_clones main register_tm_clones

解決辦法:

  • 調試時使用文件名:行號
  • 使用具體的namespace名字,Boost中就常用boost::detail來存放不應該暴露給用戶,但又不得不放到頭文件里面的函數或者class

12.6 采用有利于版本管理的代碼格式

C和C++代碼中的換行符都被編譯器(預處理之后)當做white space來對待。

  • eg:等價寫法:
foo(1, 2) foo(1,2)

12.6.1 對diff友好的代碼格式

不適用/**/來注釋多行代碼

12.6.2 對grep友好的代碼風格

12.6.3 一切為了效率

12.7 再探std::string

12.7.1 直接拷貝eager copy

12.7.2 寫時賦值copy on write

12.7.3 短字符串優化

12.8 用STL algorithm輕松解決算法面試題

生成N個不同元素的全排列

#include <algorithm> #include <vector> #include <iostream> #include <iterator>using namespace std; int main() {std::vector<int> vec = {1, 2, 3, 4};int count = 0;do{std::cout << ++count << ": ";std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, ","));cout << endl;} while (next_permutation(vec.begin(), vec.end()));return 0; }

生成從N個元素中取出M個的所有組合

  • 對序列{1,1,1,0,0,0,0}做全排列。對于每個排列,輸出數字1對應的位置上的元素。
  • eg:
#include <algorithm> #include <vector> #include <iostream> #include <iterator>using namespace std; int main() {std::vector<int> values = {1, 2, 3, 4, 5, 6, 7};std::vector<int> select = {1, 1, 1, 0, 0, 0, 0};int count = 0;do{std::cout << ++count << ": ";for (auto i = 0; i < select.size(); ++i){if (select[i] == 1){cout << values[i] << std::endl;}}cout << endl;} while (prev_permutation(select.begin(), select.end()));return 0; }

用unique()去除連續的重復空白

  • 給定一個字符串,要求原地把相鄰的多個空格替換為一個,例如a__b,輸出為a_b。
  • 所有針對于STL algorithm都只能調整區間內元素的順序,不能真正刪除容器內的元素
void removeContinousSpaces(std::string &str) {該函數的作用是“去除”容器或者數組中相鄰元素的重復出現的元素,注意 (1) 這里的去除并非真正意義的erase,而是將重復的元素放到容器的末尾,返回值是去重之后的尾地址。 (2) unique針對的是相鄰元素,所以對于順序順序錯亂的數組成員,或者容器成員,需要先進行排序,可以調用std::sort()函數/**/auto last = std::unique(str.end(), str.end(), [](char a, char b){ return a == ' ' && b == ' '; });str.erase(last, str.end()); }

用一臺4GiB內存的機器對磁盤上的單個100GB文件排序

  • 假設要歸并從小到大排序好的32個文件
  • 標準思路是:先分塊排序,然后多路歸并成輸出文件。多路歸并使用heap排序。
  • 用{make,push,pop}_heap實現多路歸并
#include <algorithm> #include <iostream> #include <iterator> #include <vector>typedef int Record; typedef std::vector<Record> File;struct Input {Record value;size_t index;const File* file;explicit Input(const File* f): value(-1),index(0),file(f){ }bool next(){if (index < file->size()){ value = (*file)[index];++index;return true;} else {return false;}}bool operator<(const Input& rhs) const{// make_heap to build min-heap, for mergingreturn value > rhs.value;} };File mergeN(const std::vector<File>& files) {File output;std::vector<Input> inputs;// 構造二叉堆// 二叉堆非常適合解決在連續的插入和刪除操作中,快速定位最大值或最小值的問題//在最大堆中,根節點的值最大; 在最小堆中,根節點的值最小;局部和整體一樣for (size_t i = 0; i < files.size(); ++i) {Input input(&files[i]);if (input.next()) {inputs.push_back(input);}}std::make_heap(inputs.begin(), inputs.end());// 循環結束,即堆為空,說明每個文件都讀取完畢了while (!inputs.empty()) {// 將堆頂元素放到末尾inputs.back()std::pop_heap(inputs.begin(), inputs.end());output.push_back(inputs.back().value);// 從堆頂元素所屬的文件讀入下一條記錄,成功則放回到堆中if (inputs.back().next()) {std::push_heap(inputs.begin(), inputs.end());} else {inputs.pop_back();}}return output; }int main() {// 假設要歸并從小到大排序好的32個文件,構造一個32元素的min heap,每次取出堆頂的元素,將其Record寫入輸出文件const int kFiles = 32;std::vector<File> files(kFiles);for (int i = 0; i < kFiles; ++i) {File file(rand() % 1000);std::generate(file.begin(), file.end(), &rand);std::sort(file.begin(), file.end());files[i].swap(file);}File output = mergeN(files);std::copy(output.begin(), output.end(),std::ostream_iterator<Record>(std::cout, "\n")); }

總結

以上是生活随笔為你收集整理的muduo C++网络库的学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

天天色天天草天天射 | 亚洲欧美日本一区二区三区 | 国产最新精品视频 | 一区二区中文字幕在线播放 | 色婷婷综合在线 | 成人午夜精品福利免费 | bayu135国产精品视频 | 免费黄色av.| 99热这里有 | 亚洲精品自在在线观看 | 999毛片 | 探花视频免费在线观看 | 国产五十路毛片 | 婷婷丁香激情五月 | 国产中文字幕一区 | 中文字幕一区二区在线播放 | 涩涩伊人| 日韩最新在线 | 日韩免费大片 | 91av在线免费观看 | 色中文字幕在线观看 | 天天草天天操 | 久久成人精品视频 | 国产精品黄色影片导航在线观看 | 综合国产视频 | 久久久久综合 | 国产视频在线看 | 国产精品高潮呻吟久久av无 | 黄色精品在线看 | 日韩免费视频观看 | 在线看片视频 | 在线播放 日韩专区 | 欧美一级免费高清 | 在线一二三区 | av经典在线 | japanesefreesexvideo高潮 | 色网站免费在线观看 | 久久天天躁狠狠躁亚洲综合公司 | 日韩精品视频一二三 | 亚洲精品视频在线看 | 精品久久久久国产 | 国产成人精品久久二区二区 | 亚洲理论在线观看 | 精品久久91| a级一a一级在线观看 | 国产午夜精品免费一区二区三区视频 | 97色在线| 美国av片在线观看 | 亚洲香蕉视频 | 在线精品亚洲一区二区 | 毛片视频电影 | 欧美精品免费在线观看 | 高清日韩一区二区 | 伊人伊成久久人综合网站 | 午夜精品一区二区三区免费视频 | 亚洲精品视频在线观看视频 | 国产精品毛片完整版 | 欧美经典久久 | 国产传媒中文字幕 | 亚洲国产精品成人av | 国产在线色视频 | 中文字幕在线视频精品 | 超碰97免费在线 | 中文字幕免费高清在线 | 亚洲狠狠操 | 蜜臀av在线一区二区三区 | 亚洲 精品在线视频 | 国产精品一区二区在线免费观看 | 久久私人影院 | 国内精品视频一区二区三区八戒 | 国产精品不卡一区 | 亚洲欧美在线视频免费 | 曰韩精品 | 黄色av高清 | 在线免费av网 | 88av色| 丁香花中文字幕 | 亚洲精品在线观看的 | 国产黄色一级片 | 成人wwwxxx视频| 欧美国产日韩久久 | 999毛片| 国产成人专区 | 亚洲精品自在在线观看 | 成人黄色小说网 | 伊人资源站 | 国内揄拍国产精品 | 色www免费视频 | 久久久国产精品一区二区三区 | 久久影院一区 | 在线电影中文字幕 | 亚洲专区中文字幕 | 日日干影院 | 国产视频在线免费 | 亚洲专区免费观看 | 国产四虎影院 | 亚洲五月婷婷 | 一本色道久久综合亚洲二区三区 | 奇米网8888 | 国产午夜精品一区二区三区 | 天天曰天天| 特级xxxxx欧美 | 国产久草在线 | 香蕉国产91 | 免费看精品久久片 | 精品国产一区二区三区在线 | 十八岁免进欧美 | 国产极品尤物在线 | 中文字幕免费一区二区 | 香蕉网在线 | 一区二区三区久久精品 | 天天草天天插 | 香蕉视频在线看 | 中文字幕av一区二区三区四区 | 婷婷免费视频 | 黄色av一级片 | 又黄又爽又无遮挡免费的网站 | 久久久久激情视频 | 一区二区三区精品久久久 | 福利在线看片 | 操操操综合 | 国产精品1024 | 精品国产一区二区在线 | 免费在线观看黄网站 | 五月婷婷激情六月 | 国产精品午夜在线观看 | 亚州精品天堂中文字幕 | 91九色最新 | 蜜臀av麻豆| 五月天婷婷综合 | 日韩午夜电影院 | 国产色秀视频 | 天天操天天操天天爽 | 香蕉在线观看视频 | 国产999视频在线观看 | 亚洲精品国产欧美在线观看 | 亚洲国产精品va在线看黑人动漫 | 国产黄色精品在线观看 | 国产精品男女 | 色橹橹欧美在线观看视频高清 | 深夜激情影院 | 狠狠干2018| 欧美成人高清 | 国产精品亚洲人在线观看 | 久久草av | 综合网伊人 | 国产欧美精品一区二区三区四区 | 精品在线观看一区二区 | 国产日韩在线观看一区 | 天天操夜夜操夜夜操 | 51久久夜色精品国产麻豆 | 久久视频二区 | 国产精品综合久久 | 国产在线精品一区 | 亚洲成年人在线播放 | 婷婷激情欧美 | 日韩免费不卡av | 久久蜜桃av | 最新91在线视频 | 99r精品视频在线观看 | 久久精品人人做人人综合老师 | 成人av电影免费在线观看 | 天天干天天碰 | 丁香婷婷激情国产高清秒播 | 三级黄色免费 | 国产成人一区二区三区在线观看 | 91精品资源 | 天天爽天天爽 | 欧美日韩国产区 | 天天草天天草 | 久久精品国产精品亚洲精品 | 久久国产精品一区二区三区四区 | 看毛片的网址 | 国产精品丝袜久久久久久久不卡 | 国产电影一区二区三区四区 | 五月婷婷操 | 天天干,狠狠干 | 亚洲日本国产精品 | 色噜噜在线观看 | 国产精品福利一区 | 91九色蝌蚪视频 | 亚洲综合日韩在线 | 亚洲尺码电影av久久 | 91精品国产入口 | 91人网站| 亚洲国产美女久久久久 | 久久久久激情 | 国产69精品久久99不卡的观看体验 | 91av视频导航 | 二区视频在线观看 | 福利久久久 | 国产精品6999成人免费视频 | 91香蕉国产 | 久久综合加勒比 | www免费看| 一区二区三区四区免费视频 | 色综合天天视频在线观看 | 91av网址| 热精品| 亚洲精品www | 国产另类av| a视频免费在线观看 | 丁香五月缴情综合网 | 午夜精品久久久久久久爽 | 国产 日韩 欧美 自拍 | 波多野结衣视频网址 | 国产精品视频线看 | 亚洲精品久久久久999中文字幕 | 欧美美女视频在线观看 | 日韩一区二区三区免费电影 | 日韩在线二区 | 韩国在线一区二区 | 日韩高清一区在线 | 天堂视频一区 | 国产精品不卡在线 | 免费影视大全推荐 | 欧美日韩中文在线 | 97操碰 | av网站免费看 | 国模精品一区二区三区 | 日韩精品在线视频 | 亚洲精品久久在线 | 日韩av中文字幕在线免费观看 | 91亚洲欧美激情 | 91精品天码美女少妇 | 欧美精品一级视频 | 日本特黄特色aaa大片免费 | 中文字幕在线播放日韩 | 日本精品xxxx | 美女视频黄,久久 | 久久夜视频 | 久久超级碰视频 | 99视频在线看 | 日韩视频在线观看视频 | 亚洲日本va午夜在线电影 | 久久免费视频这里只有精品 | 国产成人免费精品 | 免费看的黄色 | 成年人在线免费看片 | 国产福利小视频在线 | 国产视频美女 | 91丨九色丨丝袜 | 亚洲精品网站 | 久久夜色精品国产欧美一区麻豆 | 日韩激情在线 | 亚洲午夜精品一区 | 99精品久久久久久久久久综合 | 久久久久五月天 | 岛国精品一区二区 | 欧美日韩国产精品一区二区 | 激情伊人 | 日韩有色| 97在线免费观看 | 美女av在线免费 | 久久久久99999 | 综合网在线视频 | av网址在线播放 | 色网站在线观看 | 久久视频这里有久久精品视频11 | av福利电影 | 国产尤物视频在线 | 国产一级二级三级在线观看 | 久久久一本精品99久久精品 | 成人v| 亚洲午夜精品福利 | 久久久久99精品国产片 | 日韩天堂在线观看 | 一级a毛片高清视频 | 国产精品9999久久久久仙踪林 | 日韩理论电影在线观看 | 麻豆系列在线观看 | 天天爱天天干天天爽 | 天天爱天天射天天干天天 | 天天射天天搞 | 久99久中文字幕在线 | 国产精品久久久久久久久久直播 | 国产小视频在线 | 成年人在线看视频 | 四虎影视成人永久免费观看亚洲欧美 | 黄色一及电影 | 亚洲精品在线视频 | 国内精品久久久久久久久久久久 | 久久观看| 一区二区三区在线看 | 91社区国产高清 | 91精品免费在线 | 久久久久9999亚洲精品 | 色综合激情久久 | 久久久91精品国产一区二区三区 | 国产97免费 | 欧美视频二区 | 92av视频| 国产精品久久久一区二区三区网站 | а天堂中文最新一区二区三区 | 国产美女视频 | 人人射人人澡 | 精品一区在线 | 午夜精品剧场 | 国产精品一区免费在线观看 | 亚洲一区av | 午夜免费久久看 | 免费视频黄色 | 国产成人精品久久久久 | 激情久久久久久久久久久久久久久久 | 国产专区在线播放 | 国产视频999| 久久久久综合视频 | 四虎成人精品永久免费av九九 | 久久精品牌麻豆国产大山 | 欧美日韩视频在线 | 五月婷婷天堂 | 日韩有码在线播放 | 欧美另类美少妇69xxxx | 激情丁香5月 | 国产不卡免费 | 一本大道久久精品懂色aⅴ 五月婷社区 | 精品国产伦一区二区三区免费 | www.伊人网 | 久久国产精品免费一区 | 欧美日韩一区二区久久 | 五月婷亚洲 | 婷婷在线综合 | 久久97精品 | 免费韩国av| 天天操天天操天天操天天操 | 欧美日韩精品在线免费观看 | 国产精品网站一区二区三区 | 国产激情小视频在线观看 | 国产亚洲精品久 | 福利一区视频 | 久久韩国免费视频 | 免费美女av | 天天天干天天射天天天操 | 免费日韩一区二区 | 国产精选视频 | 中文字幕在线色 | 亚洲黄色一级电影 | 98久9在线 | 免费 | 伊人婷婷综合 | 天堂av网在线 | 色视频在线免费 | 7777xxxx | 免费av福利| 九九99 | 欧美高清成人 | 欧美激情视频在线免费观看 | 91av蜜桃 | 伊人资源视频在线 | 日韩免费高清在线观看 | 99久e精品热线免费 99国产精品久久久久久久久久 | 色在线视频网 | 麻豆精品视频 | 久久久久久国产精品999 | 亚洲精品免费在线观看视频 | 久青草电影 | 欧美国产日韩一区二区 | 四虎影院在线观看av | www91在线观看 | 亚洲欧美少妇 | 天天干人人干 | 国产成人一级电影 | 久草精品视频在线播放 | 久久精品综合网 | 日女人电影 | 国产视频精品免费播放 | 精品黄色视| 在线超碰av| 色999在线 | 国内外成人免费在线视频 | 亚洲精品久久久久久久不卡四虎 | 日韩在线中文字幕视频 | 亚洲精品456在线播放乱码 | 在线视频app | 国产精品久久久久久妇 | 天天干天天操天天干 | 成人高清在线观看 | 日韩高清免费在线观看 | 日韩专区视频 | 午夜精品一二区 | 日韩中文字幕国产精品 | av电影中文字幕在线观看 | 亚洲成人动漫在线观看 | 97高清视频| 偷拍福利视频一区二区三区 | 国产欧美日韩精品一区二区免费 | 干干夜夜 | 日韩在线观看的 | 亚洲午夜久久久久久久久 | 日韩欧美69 | 国产粉嫩在线 | 丁香九月激情 | 狠狠色伊人亚洲综合网站野外 | 午夜精品久久久久 | 欧美片一区二区三区 | 日韩www在线| 国产精品久久伊人 | 久久国产a | 亚洲精品午夜一区人人爽 | 亚洲涩涩涩 | 插婷婷| 999久久久久久久久6666 | 欧美日韩一区二区久久 | 国产在线播放观看 | 国产一二区免费视频 | 久草在线免费播放 | www.亚洲激情.com | www久久精品 | 在线国产激情视频 | 国产黄在线看 | 国产123av| 欧美天堂久久 | 91天堂在线观看 | 国产不卡精品 | 欧美精品一区在线 | 精品久久久久久国产偷窥 | 激情欧美日韩一区二区 | 黄色在线视频网址 | 欧美一级黄色网 | 狠狠成人 | 伊人黄色网 | 国产偷在线 | 91天堂素人约啪 | 婷婷激情站 | 国产欧美中文字幕 | 成人国产网址 | 午夜精品一区二区三区在线观看 | 狠狠色网 | 亚洲精品视频在线免费 | 欧美少妇xx | 视频在线在亚洲 | 日韩伦理片一区二区三区 | 久久黄色小说视频 | 国产91综合一区在线观看 | 婷婷综合导航 | 中文字幕网站视频在线 | 婷婷中文字幕在线观看 | 91免费高清在线观看 | 69国产成人综合久久精品欧美 | 天干啦夜天干天干在线线 | 精品视频9999 | 伊人一级 | 操操操人人 | 97热久久免费频精品99 | 91亚洲激情 | 日韩免费视频观看 | 黄色精品免费 | 免费在线观看一级片 | 国产精品夜夜夜一区二区三区尤 | 国产精品丝袜 | 在线黄色av电影 | 欧美日韩亚洲在线观看 | 五月天久久久久久 | 色婷婷狠狠干 | 91精品国产自产老师啪 | 欧美精品一级视频 | www.操.com| 久久精品爱爱视频 | 亚洲国产视频网站 | 久99精品 | 国产一性一爱一乱一交 | 国产精品 日本 | 久久久久看片 | 欧美极品xxx | 免费观看日韩 | 看片的网址| 国产一级一级国产 | 精品国产伦一区二区三区观看方式 | 精品视频 | 黄色av成人在线 | 成年人在线免费看片 | 亚洲视频精品 | 国产又粗又猛又黄视频 | 999成人国产 | 九九久久电影 | 91精品入口 | 一区二区三区免费在线观看视频 | 天天色播 | 国产日本亚洲高清 | 亚洲精品在线一区二区三区 | 成人片在线播放 | 天堂入口网站 | 91视频麻豆视频 | 亚洲午夜在线视频 | 国产亚洲精品福利 | 亚洲3级 | 少妇精品久久久一区二区免费 | 国产精品综合久久久久久 | 成人av直播 | 天天操天天综合网 | 日本mv大片欧洲mv大片 | 黄网站色视频免费观看 | 奇米影视在线99精品 | 免费观看一级视频 | 91成品视频 | 日韩成人邪恶影片 | 久久夜靖品 | 久久婷婷精品视频 | 天天在线免费视频 | 亚洲欧美视频 | 亚洲乱亚洲乱亚洲 | av 一区二区三区四区 | 久久在线| 国产精品福利在线观看 | 国产aaa免费视频 | 久久99国产综合精品免费 | 在线欧美最极品的av | 国产高清视频 | 成人黄色资源 | 美女视频久久久 | 日韩国产精品久久 | 久久精品亚洲一区二区三区观看模式 | 久久99精品热在线观看 | 久久久久电影 | 久久国产欧美日韩精品 | 中文字幕在线国产精品 | 在线观看亚洲专区 | 国产高清在线精品 | 国产亚洲精品女人久久久久久 | 亚洲精品影院在线观看 | 亚洲 欧美 综合 在线 精品 | 四虎欧美| 午夜精品电影一区二区在线 | 日韩亚洲在线 | 精品1区2区3区 | www99精品| 日韩伦理一区二区三区av在线 | 久久丁香 | 午夜免费久久看 | 亚洲电影院 | 97精品国产97久久久久久免费 | 日韩精品一区二区三区水蜜桃 | 日韩欧美在线中文字幕 | 成人免费视频网 | 国产精品久久久久久麻豆一区 | 欧美a级一区二区 | 日韩 在线观看 | 中文一区二区三区在线观看 | 波多野结衣一区三区 | 成人久久毛片 | 色吊丝在线永久观看最新版本 | 97在线播放视频 | 天天曰天天 | 操久久免费视频 | 亚洲精品麻豆视频 | 国产精品久久久久婷婷 | 国产视频久久久 | 久久精品国产免费看久久精品 | 国产精品入口传媒 | 亚洲一区二区三区精品在线观看 | 激情文学丁香 | 天天操人人干 | 亚洲一级性 | 中文字幕在线观看的网站 | 国产h片在线观看 | 国产黄色大片免费看 | 国内偷拍精品视频 | 狠狠色狠狠综合久久 | 偷拍精偷拍精品欧洲亚洲网站 | 国产成人免费在线观看 | 最近日本mv字幕免费观看 | 婷婷精品国产一区二区三区日韩 | 亚洲天堂香蕉 | 亚洲精品成人在线 | 91成人网在线观看 | 久久精品一 | 看片网站黄色 | 日批视频在线 | 在线观看黄色国产 | 在线看毛片网站 | 久久tv | 久久久久久国产一区二区三区 | 久久tv | 久久成人一区二区 | 麻花豆传媒一二三产区 | 国产精品久久久久久久久久久不卡 | 久久在线电影 | 久久99精品热在线观看 | 免费激情在线电影 | 在线亚洲观看 | 午夜性色| 久久久国产精品人人片99精片欧美一 | 97色资源 | 国产婷婷精品av在线 | 亚洲人天堂| 久久成人18免费网站 | 欧美视屏一区二区 | 国产呻吟在线 | 国产午夜精品一区 | 免费观看视频的网站 | 亚洲自拍偷拍色图 | 日韩成人不卡 | 久久久亚洲麻豆日韩精品一区三区 | 99r在线视频| 一级精品视频在线观看宜春院 | 狠狠的干狠狠的操 | 久久男人免费视频 | 91视频在线播放视频 | 日韩欧美一区二区三区视频 | 在线中文视频 | 国产福利在线不卡 | 日韩精品免费一区二区三区 | 久久国产精品久久久 | 狠狠狠狠狠狠天天爱 | 白丝av免费观看 | 最近2019年日本中文免费字幕 | 成人国产精品入口 | 在线观看国产日韩 | 成人手机在线视频 | 欧美aaa级片 | 国产特级毛片aaaaaaa高清 | 91久久久国产精品 | 精品免费在线视频 | 99视频免费在线观看 | 中文字幕在线观看网址 | 久久99精品国产91久久来源 | 久久久精华网 | 96av在线视频| 国产精品一区二区你懂的 | 亚洲乱码在线观看 | av高清免费| av一区在线 | 国产精品白浆视频 | 久久精品电影 | 人人超碰免费 | 在线视频观看成人 | 亚洲精品免费观看 | 亚洲成a人片77777kkkk1在线观看 | 国产日韩欧美在线 | 天天操天天玩 | 精品久久久久久亚洲综合网站 | 激情电影在线观看 | 欧美va日韩va | 99热国产在线中文 | 免费a视频在线观看 | 99久久婷婷国产一区二区三区 | 天天干天天干天天干天天干天天干天天干 | 免费观看不卡av | 91亚洲狠狠婷婷综合久久久 | 欧美精品一区在线发布 | 五月婷婷色综合 | 爱爱av在线 | 久久久久久久久久久黄色 | 国产精品伦一区二区三区视频 | 日韩三级在线观看 | 日韩精品一区电影 | 蜜臀av网址 | 国产视频 亚洲视频 | 国产在线p | 麻豆免费看片 | 激情视频免费观看 | 91在线中字 | 亚洲精品资源在线 | 波多野结衣在线播放一区 | 午夜三级福利 | 女人高潮特级毛片 | 手机av在线网站 | 日韩免 | 操操操天天操 | 在线网址你懂得 | 色五月色开心色婷婷色丁香 | 超碰av在线免费观看 | 天天爽夜夜爽精品视频婷婷 | 天天操天天能 | 日韩精品在线播放 | 日韩精品免费一线在线观看 | 精品国产亚洲一区二区麻豆 | 三三级黄色片之日韩 | www操操操 | 免费男女羞羞的视频网站中文字幕 | 日韩午夜精品福利 | 欧美一区日韩精品 | 亚洲日本成人 | 色婷婷激情| 超碰99在线 | 国产精品久久久久久久久久不蜜月 | 日本一区二区高清不卡 | 欧美视屏一区二区 | 日本丰满少妇免费一区 | 国产精品婷婷 | 国产中文伊人 | 激情开心网站 | 99热这里只有精品在线观看 | 国产精品9999| 亚洲一级在线观看 | 日韩av免费一区 | 日韩电影在线观看一区 | 国产精品日韩久久久久 | 午夜av一区二区三区 | 日韩网站在线免费观看 | 欧美极度另类 | 黄色三级在线观看 | 精品不卡视频 | 三级视频片 | 亚洲h色精品 | 日韩视频免费观看高清完整版在线 | 国产成人久久精品一区二区三区 | 日日夜夜免费精品视频 | 久久久久9999亚洲精品 | 久久亚洲美女 | 91成人免费电影 | 色婷婷福利 | 久久精品欧美视频 | 久草在线资源视频 | 日韩一区精品 | 免费视频久久 | 字幕网av | 91精品播放 | 日韩中文字幕视频在线观看 | 欧美在线视频第一页 | 97视频在线观看网址 | 久久久国产99久久国产一 | 国产精品久久久久久久久久久杏吧 | 久久精品国产成人 | 2019中文字幕网站 | www.天天射.com | av一级片网站 | 欧洲精品视频一区 | 国产97碰免费视频 | 国产伦精品一区二区三区无广告 | 四虎欧美 | 久久婷婷激情 | 日韩免费一级电影 | 久久亚洲专区 | 日日精品 | 天天爱av导航 | 婷婷综合久久 | 久久久久久毛片精品免费不卡 | 久久久久久久久久久影视 | 黄色免费观看网址 | 精壮的侍卫呻吟h | 99热最新网址| 国产成人在线网站 | 亚洲一区视频免费观看 | 九九在线高清精品视频 | 国产一区二区三区免费在线观看 | 免费av片在线 | 欧美老女人xx | 国产视频亚洲 | 亚洲一级在线观看 | 免费成人看片 | 国产精品久久久久一区二区三区 | 免费观看www小视频的软件 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 成人精品电影 | 干 操 插| 黄色免费大片 | 夜夜嗨av色一区二区不卡 | 一区二区三区在线免费观看视频 | 久久久午夜精品理论片中文字幕 | 国产三级精品三级在线观看 | 免费能看的黄色片 | 中文字幕在线看视频 | 69亚洲精品| 黄色特一级片 | 久久久久久久久久久免费av | 久久亚洲免费 | av在线播放网址 | 97夜夜澡人人爽人人免费 | 亚洲黑丝少妇 | 伊人影院在线观看 | 亚洲日本一区二区在线 | 久久影院中文字幕 | 91av视频在线观看 | 免费人成在线观看网站 | 在线观看你懂的网站 | 操夜夜操| 亚洲黄色a| 四虎成人av| 午夜精品导航 | 中文字幕中文字幕在线中文字幕三区 | 久久欧洲视频 | 91免费视频网站在线观看 | 韩国视频一区二区三区 | 日本中文字幕在线电影 | 国产在线999| 国产黄影院色大全免费 | 国产精品女教师 | 999久久国产精品免费观看网站 | 一区二区三区播放 | 日韩精品视频在线观看免费 | 涩五月婷婷 | 中文字幕乱码在线播放 | 国产又粗又猛又爽又黄的视频免费 | 国产精品女人网站 | 国产精品一区二区三区四 | 99久久成人 | 国产手机在线视频 | 免费三级网 | www毛片com| 97福利在线| 国产色区| 久久草精品 | 99久久久久久国产精品 | 亚洲欧洲在线视频 | 久久人人爽爽 | 99精品国产在热久久下载 | 欧美一二三区在线观看 | 91亚洲欧美激情 | 国产免费xvideos视频入口 | a级免费观看 | 欧美一级日韩三级 | 国产成人精品一区二三区 | 久久精品一区二区三区视频 | 久久超级碰| 久久久久亚洲精品 | 日韩激情综合 | 亚洲精品视频观看 | 日产乱码一二三区别在线 | 日本少妇高清做爰视频 | 免费高清在线视频一区· | 最近中文字幕免费大全 | 高清免费在线视频 | 色是在线视频 | 日韩在线观看中文 | 久久九精品| 久久你懂得 | 五月婷婷另类国产 | 精品999 | 亚洲中字幕 | 国产欧美精品xxxx另类 | 在线观看精品一区 | 在线观看免费观看在线91 | 国产精品第7页 | 黄色动态图xx | 国产在线观看国语版免费 | 操操爽| 黄色aaa毛片 | 天天久久夜夜 | 久久免费视频3 | 欧美国产日韩中文 | 日日爽夜夜爽 | 久久伦理电影网 | 婷婷色五 | 午夜男人影院 | av网址aaa| 91热在线| 免费开视频 | 中文字幕精品在线 | 日韩精品久久久久久久电影99爱 | 欧美视频18 | 国产精品久久久久久久久婷婷 | 密桃av在线 | 国产91av视频在线观看 | 欧美激情精品久久久 | 日韩免费b | 欧美色图亚洲图片 | 五月婷社区 | 成年人免费在线观看网站 | 日韩性色 | 久久久久久看片 | 欧美精品乱码久久久久久按摩 | 久久久久国产精品www | 黄色软件在线观看免费 | 欧美福利久久 | 国产小视频精品 | 亚洲精品视频在线免费播放 | 国产伦理久久 | 成人97人人超碰人人99 | 成人在线视频网 | 91在线播放综合 | 免费视频一二三 | 久久亚洲福利 | 久热免费在线 | 亚洲一区二区黄色 | 国产精选在线 | 99久久夜色精品国产亚洲 | 激情偷乱人伦小说视频在线观看 | 99热只有精品在线观看 | 亚洲午夜激情网 | 国产精品情侣视频 | 免费精品在线 | 免费在线看v | 97在线视| 一区二区三区精品在线视频 | 亚洲成av片人久久久 | 国产一区二区三区免费在线 | 天天干天天草天天爽 | 久久久网页 | 亚洲草视频 | 欧美色久 | 免费黄色网址网站 | 日韩高清成人 | 成人黄色小视频 | 国产黑丝一区二区三区 | 国产99久久 | 免费看一及片 | 国产精品对白一区二区三区 | 国产一级在线播放 | 狠狠久久婷婷 | 亚洲第一区在线观看 | 一 级 黄 色 片免费看的 | 在线导航av | 亚洲欧美在线观看视频 | 精品999久久久 | 日日干日日色 | 欧美亚洲成人xxx | 五月天综合网站 | 2024国产在线 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 亚洲高清激情 | 免费看片成人 | 国产精品一区免费观看 | 欧美资源在线观看 | 高清日韩一区二区 | 日韩国产高清在线 | 69视频在线播放 | 西西44人体做爰大胆视频 | 欧美在线aaa | 久草.com| 91麻豆免费版 | 国产伦精品一区二区三区四区视频 | 99精品视频在线观看免费 | 伊人国产视频 | 成人a视频在线观看 | 日韩中文字幕免费在线观看 | 久久精品国产免费看久久精品 | 中文字幕在线观看播放 | 在线中文字母电影观看 | 精品视频中文字幕 | 麻豆免费观看视频 | 一区二区免费不卡在线 | 色九九视频 | 亚洲精品免费在线 | 久久久99精品免费观看 | 国产精品18久久久久久久久 | 91久久久久久久 | 色全色在线资源网 | 日本不卡123| 黄色1级毛片 | 国产精品毛片久久久久久 | 玖草影院| 婷婷丁香在线视频 | 亚洲精品乱码久久久久 | h视频在线看 | 免费在线观看午夜视频 | 精品免费观看视频 | 干天天| 久久av中文字幕片 | 欧美精品一区二区三区四区在线 | 成人在线观看免费视频 | 亚洲国产精品成人综合 | 国产精品21区 | 久久精品一区二区三区四区 | 久热av在线 | 丁香五婷| 亚洲精品在线观看视频 | 国产999精品 | 三级a视频 | 在线不卡视频 | 综合网久久 | 伊人久久精品久久亚洲一区 | 黄色小说视频在线 | 亚洲 中文 在线 精品 | av片中文| 亚洲午夜精品一区二区三区电影院 | 日韩免费一区 | 国产黄色精品在线观看 | 精品色综合 | www好男人 | 99久久久免费视频 | 欧美二区三区91 | 欧美日韩久久不卡 | 久精品在线| 欧美精品在线观看免费 | 一区二区三区日韩在线观看 | 91精品国产91p65| 国产黄色片免费看 | 国产分类视频 | 天天射综合网视频 | 97人人澡人人爽人人模亚洲 | 女人18片毛片90分钟 | 中日韩欧美精彩视频 | 天天爱天天舔 | 色妞久久福利网 | 91av在线电影 | 日韩超碰| 精品欧美小视频在线观看 | 国产91全国探花系列在线播放 | 97国产大学生情侣白嫩酒店 | 91丨九色丨高潮 | 992tv在线成人免费观看 | 一区二区在线电影 | 麻豆视频免费在线播放 | 天天干天天拍天天操天天拍 | 深夜免费福利视频 | 少妇性aaaaaaaaa视频 | 国色天香av| 九九免费视频 | 亚洲精品视频在线观看免费视频 | 特黄免费av| 日韩欧美在线观看 | av福利在线导航 | 99爱爱| 精品麻豆| 国产精品黑丝在线观看 | 成年人视频在线免费观看 | 热久久电影 | 日韩成人黄色av |