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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL源码剖析 空间配置器 查漏补缺

發(fā)布時間:2023/12/13 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL源码剖析 空间配置器 查漏补缺 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ptrdiff_t含義?

  • 減去兩個指針的結(jié)果的帶符號整數(shù)類型
  • ptrdiff_t (Type support) - C 中文開發(fā)手冊 - 開發(fā)者手冊 - 云+社區(qū) - 騰訊云

std::set_new_handler()函數(shù)的理解

  • 關于set_new_handler的理解_wck0617-CSDN博客
  • new分配內(nèi)存的時候? 如果分配的空間不足 采取什么樣的措施

自己實現(xiàn)空間配置器

#include <new> //for placement new #include <cstddef> //for ptrdiff_t size_t #include <cstdlib> //for exit #include <climits> //for UINT_MAX #include <iostream> //for cerr #include <vector>namespace Chy{template <class T>inline T* _allocate(ptrdiff_t size,T*){std::set_new_handler(0);T* tmp = (T*)(::operator new((std::size_t)(size * sizeof (T))));if (tmp == 0){std::cerr << "out of memory" << std::endl;exit(1);}return tmp;}template<class T>inline void _deallocate(T* buffer){::operator delete (buffer);}template<class T1,class T2>inline void _construct(T1 *p,const T2& value){new(p) T1 (value); //沒看懂}template <class T>inline void _destroy(T* ptr){ptr->~T();}template <class T>class allocator{public:typedef T value_type;typedef T* pointer;typedef const T* const_pointer;typedef T& reference;typedef const T& const_reference;typedef std::size_t size_type;typedef ptrdiff_t difference_type;template<class U>struct rebind{typedef allocator<U>other;};pointer allocate(size_type n,const void * hint = 0){return _allocate((difference_type)n,(pointer)0);}void deallocate(pointer p,size_type n){_deallocate(p);}void construct(pointer p,const T& value){_construct(p,value);}void destroy(pointer p){_destroy(p);}pointer address(reference x){return (pointer)&x;}const_pointer const_address(const_reference x){return (const_pointer)&x;}size_type max_size()const{return size_type(UINT_MAX/sizeof (T));}}; } int main(){int ia[5] = {0,1,2,3,4};unsigned int i;std::vector<int,Chy::allocator<int>>iv(ia,ia+5);for (int j = 0; j < iv.size(); ++j) {std::cout << iv[j] << " ";}std::cout << std::endl; }
  • SGI STL 使用了專屬的 擁有層級配置的 特殊的空間配置器
  • SGI STL 提供了 一個標準的空間配置器的接口 叫做 simple_alloc

SGI STL 封裝的 特殊的空間配置器 alloc

  • 使用的時候 std::vector<int,std::alloc>iv;std::alloc 采用默認的形式
  • 為了精密分工,STL a llo c a to r決定將這兩階段操作區(qū)分開來。內(nèi)存配置操作 由 alloc: al locate ()負責,內(nèi)存釋放操作由alloc : : deallocate ()負責;對象構(gòu)造操作由::construct:()負責,對象析構(gòu)操作由:;destroy負責

  • new算式內(nèi)含兩階段操作: (1 )調(diào) 用 ::operator new配置內(nèi)存; ⑵ 調(diào) 用Foo::Foo()構(gòu)造對象內(nèi)容。
  • delete算式也內(nèi)含兩階段操作:(1)調(diào)用Foo:~Foo ()將對象析構(gòu);(2 ) 調(diào) 用 ::operator delete釋放內(nèi)存。

?type_traits

  • c++11——type_traits 類型萃取 - 農(nóng)民伯伯-Coding - 博客園
  • C++ STL __type_traits解析 - 知乎

構(gòu)造和析構(gòu)的基本工具 construct()和destroy()

#include <new> //for placement new #include <cstddef> //for ptrdiff_t size_t #include <cstdlib> //for exit #include <climits> //for UINT_MAX #include <iostream> //for cerr #include <vector>using namespace std; template<class T> struct __type_traits {typedef __true_type this_dummy_member_must_be_first;typedef __false_type has_trivial_default_constructor;typedef __false_type has_trivial_copy_constructor;typedef __false_type has_trivial_assignment_constructor;typedef __false_type has_trivial_destructor;typedef __false_type is_POD_type; };template<class T1,class T2> inline void _construct(T1 *p,const T2& value){new(p) T1 (value); //placement new; 調(diào)用T1::T1(value) }/** destroy() 的兩個版本*/ //以下是 destroy() 第一版本 接收一個指針 template <class T> inline void _destroy(T* ptr){ptr->~T(); //調(diào)用 ~T() }/********************************************************************/ //如果元素的型別(value_type)有non_trivial destructor template <class ForwardIterator> inline void __destroy_aux(ForwardIterator first,ForwardIterator last,std::__false_type){for( ; first < last;++first){destroy(&*first); //調(diào)用destroy的第一個版本} } //如果元素的型別(value_type)有trivial destructor template <class ForwardIterator> inline void __destroy_aux(ForwardIterator,ForwardIterator,std::true_type){}//判斷元素的型別(value type) 是否有 trivial destructor template <class ForwardIterator,class T> inline void __destroy(ForwardIterator first,ForwardIterator last,T*){typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;__destroy_aux(first,last,trivial_destructor()); }//destroy()第二版本 接收兩個迭代器 這個函數(shù)設法找出元素的型別 //進而使用 __Type_traits<> 求取適當?shù)拇胧?template <class ForwardIterator> inline void destroy(ForwardIterator first,ForwardIterator last){ // __destroy() } /********************************************************************//** 以下是destroy() 第二版本針對迭代器為 char* 和 wchar_t 的特化版本*/ inline void destroy(char*,char*){} inline void destroy(wchar_t *,wchar_t *){}

  • ?第二版本的接受first和last兩個迭代器 準備將[first,last)范圍內(nèi)的元素都析構(gòu)掉,但是如果這段范圍很大,對于每一個元素的析構(gòu) 都 無關痛癢(即 trivial destructor類型的),對于效率是一種損失。
  • 因此 需要進行偏特化的操作,在執(zhí)行析構(gòu)函數(shù)之前進行類型的判斷。如果是 true_type 什么都不做直接結(jié)束,如果是false_type的類型,使用循環(huán)的方式,針對每個元素使用 第一個版本的destroy()函數(shù)進行析構(gòu)釋放
  • 問題:如何實現(xiàn)上述的 value_type() 和 __type_traits<> ??

空間的配置和釋放

  • 對象構(gòu)造之前的空間配置和對象析構(gòu)之后的空間的釋放 由 <stl_alloc.h>負責

設計思路

  • 向系統(tǒng)的heap 申請內(nèi)存空間
  • 考慮 多線程狀態(tài)
  • 考慮內(nèi)存不足的應對措施
  • 考慮小型區(qū)塊可能造成的內(nèi)存碎片問題
  • 代碼舉例 排除了 多線程的處理

設計思想

  • 考慮到小型區(qū)塊造成的內(nèi)存破碎問題,SGI設計了雙層級配置器,第一層級使用malloc()和free(),第二層級視情況 采用不同的策略。
  • 當配置的區(qū)塊超過128bytes時 視為足夠大 使用第一層級配置器
  • 當配置的區(qū)塊小于128bytes時 為了降低額外的負擔,使用memory pool的方式
  • alloc并不接受任何 template型別的參數(shù)
  • 無論alloc使用的是第一級或者第二級配置器 都需要外包一層接口
#ifdef __USE_MALLOC typedef __malloc_alloc_template<0>malloc_alloc; typedef malloc_alloc alloc; //令alloc為第一級配置器//令alloc為第二級配置器 typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS,0>alloc;#endiftemplate<class T,class Alloc> class simple_alloc{ public:static T* allocate(std::size_t n){return 0==n?0:(T*)Alloc::allocate(n * sizeof(T));}static T* allocate(void){return (T*)Alloc::allocate(sizeof (T));}static void deallocate(T* p,size_t n){if (n!=0){Alloc::deallocate(p,n * sizeof(T));}}static void deallocate(T* p){Alloc::deallocate(p,sizeof(T));} };
  • 內(nèi)部的四個函數(shù)本質(zhì)上是 單純的轉(zhuǎn)接調(diào)用的關系 調(diào)用傳遞給配置器的(可能是第一級別 也可能是 第二級別)
  • SGI STL容器都使用 這個simple_alloc的接口
template <class T,class Alloc = alloc> class vector{ protected://專屬空間配置器 每次分配一個元素的大小typedef simple_alloc<value_type,Alloc> data_allocator;void deallocate(){if(){data_allocator::deallocate(start,end_of_storage - start);}} };

第一級配置器 __malloc_alloc_template剖析

#if 0 # include<new> # define __THROW_BAD_ALLOC throw bad_alloc #elif !defined(__THROW_BAD_ALLOC) # include<iostream> # define __THROW_BAD_ALLOC std::cerr << "out of memory" << std::endl; exit(1); #endif//malloc-based allocator 通常比稍后介紹的default alloc要慢 //但是它是線程安全的 thread-safe,并對于空間的運用比較高效 //以下是第一級別配置器 //無“template 型別參數(shù)” 至于非型別參數(shù) inst 完全沒有用到 template <int inst> class __malloc_alloc_template{ private://以下內(nèi)容都是函數(shù)指針,所代表的函數(shù)用于處理內(nèi)存不足的情況//oom : out of memorystatic void *oom_malloc(std::size_t);static void *oom_realloc(void*,std::size_t);static void (* __malloc_alloc_oom_handler)(); public:static void* allocate(std::size_t n){void * result = malloc(n);//第一級配置器 直接使用malloc進行內(nèi)存的分配//當無法滿足內(nèi)存分配的需求的時候,使用oom_malloc()if(result == 0){result = oom_malloc(n);}return result;}static void deallocate(void* p,size_t /* n */){free(p); //第一級配置器 直接使用 free()進行釋放}static void* reallocate(void* p,size_t /*old_size*/,size_t new_size){void *result = realloc(p,new_size); //第一級別配置器直接使用realloc()//以下無法滿足需求的時候 改用oom_realloc()if (0==result){result = oom_realloc(p,new_size);}return result;}//以下是仿真C++的set_new_handler(),換句話說 你可以通過他指定自己的out_of_handlerstatic void(*set_malloc_handler(void (*f)()))(){void (* old)() = __malloc_alloc_oom_handler;__malloc_alloc_oom_handler = f;return (old);}}; //malloc_alloc out_of_memory handling //初始化為0 template <int inst> void (* __malloc_alloc_template<inst>::__malloc_alloc_oom_handler)() = 0;template <int inst> void* __malloc_alloc_template<inst>::oom_malloc(std::size_t n) {void (*my_malloc_handler)();void * result;for(;;){ //不斷嘗試 釋放、配置、再次釋放、再次配置......my_malloc_handler = __malloc_alloc_oom_handler;if (0 == my_malloc_handler){__THROW_BAD_ALLOC;}(*my_malloc_handler)();//調(diào)用處理例程,企圖釋放內(nèi)存result = malloc(n); //再次配置內(nèi)存if (result){return result;}} }template <int inst> void *__malloc_alloc_template<inst>::oom_realloc(void *p, std::size_t n) {void (* my_malloc_handler)() = __malloc_alloc_oom_handler;void * result;if(0 == my_malloc_handler){__THROW_BAD_ALLOC;}(*my_malloc_handler)();//調(diào)用處理例程,企圖釋放內(nèi)存result = realloc(p,n);//再次嘗試配置內(nèi)存if (result){return result;} }//以下直接將參數(shù) inst 指定為0 typedef __malloc_alloc_template<0>malloc_alloc;
  • ?第一級配置器 使用malloc、free、realloc等C函數(shù)執(zhí)行內(nèi)存的配置、釋放、重新配置,并實現(xiàn)了類似C++ newhandler的機制 ,但是不能直接使用C++的new handler的機制 因為他并沒有使用 ::operator new的方式來配置內(nèi)存
  • C++ 的new handler的機制是 要求系統(tǒng)在內(nèi)存配置需求無法被滿足的時候 調(diào)用一個用戶自定義的函數(shù) 即 ::operator new無法完成任務 拋出std::bad_alloc異常狀態(tài)之前 先調(diào)用客戶指定的處理例程 。這個處理的例程 被稱作new handler
  • 第一級配置器? allocate()和 reallocate()都會在調(diào)用malloc 和 realloc不成功之后 改用 oom_malloc 和 oom_realloc 后者函數(shù)內(nèi)設定一個循環(huán),不斷調(diào)用 內(nèi)存不足處理的程序? ,期望某一次可以得到足夠的內(nèi)存。如果未指定例程 便會調(diào)用 __THROW_BAD_ALLOC 拋出bad_alloc異常信息,或者使用 exit(1) 終止程序

第二級配置器__default_alloc_template 剖析

  • 第二級配置器 使用機制 避免造成內(nèi)存的碎片?
  • 額外負擔 無法避免 涉及到操作系統(tǒng)的內(nèi)存管理;但是區(qū)塊越小,顯現(xiàn)的 額外的負擔的比例就會越來越大,就會顯得浪費

  • ?大于128轉(zhuǎn)交第一級配置器,小于128使用內(nèi)存池管理。
  • 次層配置:每次配置大內(nèi)存,維護對應的自由鏈表,下次若有相同大小的內(nèi)存需求,直接從自由鏈表中撥出
  • 配置器 負責內(nèi)存的釋放和回收?
  • 第二級配置器的小額區(qū)塊的內(nèi)存空間是以8的倍數(shù)進行劃分,劃分的時候 會自動將需求量上調(diào)至8的倍數(shù)
  • 維護16個free_lists 各自管理 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128
union obj{union obj * free_list_link;char client_data[1];// The client sees this };
  • 維護鏈表是需要 額外的指針 造成額外的負擔
  • 考慮到 obj 使用的是union,可以視為一個指針 指向相同類型的另外一個obj ; obj也可以視為一個指針 指向?qū)嶋H的區(qū)塊? 一物二用

enum {__ALIGN = 8}; //小型區(qū)塊的上調(diào)邊界 enum {__MAX_BYTES = 128};//小型區(qū)塊的上限 enum {__NFREELISTS = __MAX_BYTES/__ALIGN};//free-lists的個數(shù)using namespace std; //以下是第二級配置器 //注意:無 template型別參數(shù) 且第二參數(shù)哇怒氣按沒有被派上用場 //第一參數(shù)用于多線程的環(huán)境 本示例 暫未涉及 template <bool threads,int inst> class __default_alloc_template{ private://ROUND_UP() 將bytes上調(diào)至8的倍數(shù)static size_t ROUND_UP(size_t bytes){return (((bytes) + __ALIGN - 1) & ~(__ALIGN-1));}private:union obj{ //free-lists 節(jié)點構(gòu)造union obj * free_list_link;char client_data[1];// The client sees this}; private://16個free-listsstatic obj * volatile free_list[__NFREELISTS];//以下函數(shù)根據(jù)區(qū)塊的大小 決定使用第 n 號free-list,n從1開始算起static size_t FREELIST_INDEX(size_t bytes){return (((bytes) + __ALIGN-1)/__ALIGN-1);}//返回一個大小為n的對象 并可能加入大小為n 的其他區(qū)塊到free liststatic void* refill(size_t n);//配置一大塊區(qū)間 可以容納nobjs個“size”大小的區(qū)塊//如果配置nobjs個大小的區(qū)塊有所不方便 ,可以降低nobjsstatic char * chunk_alloc(size_t size,int &objs);//Chunk allocation statestatic char *start_free;//內(nèi)存池起始的位置 只在chunk_alloc()中變化static char *end_free;//內(nèi)存池結(jié)束的位置 只在chunk_alloc()中變化static size_t heap_size;public:static void* allocate(size_t n){}static void deallocate(void* p,size_t n){}static void *reallocate(void* p,size_t old_sz,size_t new_sz){} };//以下是static data member 的定義與初值的設定 template <bool threads,int inst> char* __default_alloc_template<threads,inst>::start_free = 0;template <bool threads,int inst> char* __default_alloc_template<threads,inst>::end_free = 0;template <bool threads,int inst> size_t __default_alloc_template<threads,inst>::heap_size = 0;template <bool threads,int inst> typename __default_alloc_template<threads,inst>::obj * volatile __default_alloc_template<threads,inst>::free_list[__NFREELISTS] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

空間配置函數(shù) allocate()

  • 這個函數(shù)首先判斷區(qū)塊的大小 ,大于128 使用第一級配置器,小于128 檢查對應的 free list。如果free list之內(nèi)有可用的區(qū)塊 就直接拿來使用
  • 如果沒有可用的區(qū)塊,就將區(qū)塊大小上調(diào)至8的倍數(shù)邊界 使用refill()準備為free list填充空間?
template <bool threads,int inst> void* __default_alloc_template<threads,inst>::allocate(size_t n) {obj* volatile *my_free_list;obj* result;//大于128就調(diào)用第一級配置器if(n>(size_t)__MAX_BYTES){return (malloc_alloc::allocate(n));}//尋找16個free lists中適當?shù)囊粋€my_free_list = free_list + FREELIST_INDEX(n);result = *my_free_list;if (result==0){//沒有找到free list,需要重新補充 free listvoid *r = refill(ROUND_UP(n));return r;}//調(diào)整free list*my_free_list = result->free_list_link;return result; }

注意事項

  • 注意事項:類里面聲明的靜態(tài)函數(shù) 不能帶有{} ,否則后期實現(xiàn)函數(shù)邏輯的時候 編譯不通過
  • 只有用戶自定義的類型作為函數(shù)的返回值的時候 需要使用typename關鍵字

template <bool threads,int inst> void __default_alloc_template<threads,inst>::deallocate(void *p, size_t n) {obj *q = (obj*)p;obj *volatile * my_free_list;//大于128 就調(diào)用第一級配置器if(n > (size_t)__MAX_BYTES){malloc_alloc ::deallocate(p,n);return;}//尋找對應的free listmy_free_list = free_list + FREELIST_INDEX(n);//調(diào)整free list 回收區(qū)塊q->free_list_link = *my_free_list;*my_free_list = q;}

?重新填充 free lists

  • 當 free list中沒有可用的區(qū)塊的時候 需要調(diào)用 refill() 函數(shù) 為free list重新填充空間,新的空間將取自內(nèi)存池(通過chunk_alloc完成 )
  • 缺省獲得 20個新節(jié)點,萬一內(nèi)存池空間不足 獲得的節(jié)點數(shù)可能 小于20
//返回一個大小為n的對象,并且有的時候會適當?shù)奈籪ree list增加節(jié)點 //假設n已經(jīng)上調(diào)為8的倍數(shù) template <bool threads,int inst> void* __default_alloc_template<threads,inst>::refill(size_t n) {int nobjs = 20;//調(diào)用chunk_alloc() 嘗試獲取nobjs個區(qū)塊作為free list的新的節(jié)點//注意參數(shù)nobjs是pass by reference的方式char* chunk = chunk_alloc(n,nobjs);obj* volatile * my_free_list;obj* result;obj* current_obj,*next_obj;int i;//如果只獲得一個區(qū)塊 這個區(qū)塊就會被分配給調(diào)用者使用 free list無新的節(jié)點if (1 == nobjs){return chunk;}//否則準備調(diào)整free list 納入新的節(jié)點my_free_list = free_list + FREELIST_INDEX(n);//在chunk空間內(nèi) 建立free listresult = (obj*) chunk; //這一塊準備返回給客戶端//以下導引free list指向新的配置的空間(取自內(nèi)存池)*my_free_list = next_obj = (obj*)(chunk +n);//以下將free list的各個節(jié)點串接起來for(i=1;;i++){ //從1開始 因為第0個將會返回給客戶端current_obj = next_obj;next_obj = (obj*)((char *)next_obj + n);if (nobjs-1==i){current_obj->free_list_link = 0;break;} else{current_obj->free_list_link = next_obj;}}return (result); }

內(nèi)存池

  • 從內(nèi)存池取空間 給free list使用? 是chunk alloc函數(shù)的作用
//假設n已經(jīng)上調(diào)為8的倍數(shù) //注意參數(shù)nobjs是pass by reference /** size:每一個objs的大小+* nobjs:創(chuàng)建objs的數(shù)量*/ template <bool threads,int inst> char* __default_alloc_template<threads,inst>::chunk_alloc(size_t size, int &nobjs) {char* result;size_t total_bytes = size * nobjs;size_t byte_left = end_free - start_free;//內(nèi)存池剩余空間if (byte_left >= total_bytes){//內(nèi)存池的空間滿足需求量result = start_free;start_free += total_bytes;return result;} else if(byte_left >= size){//內(nèi)存池存儲的空間不能完全滿足需求,但是足夠供應一個 (含)以上的區(qū)塊nobjs = byte_left/size; //可以滿足的數(shù)量total_bytes = nobjs * size;result = start_free;start_free += total_bytes;return (result);} else{//內(nèi)存池剩余的空間連一個區(qū)塊的大小都無法滿足size_t bytes_to_get = 2 * total_bytes + ROUND_UP(heap_size >> 4);//以下內(nèi)容試著從內(nèi)存池 殘余中 尋找if (byte_left > 0){//內(nèi)存中還存在部分的內(nèi)存空間 但是這個內(nèi)存空間小于一個size 但是大于0//首先找到適當?shù)膄ree listobj* volatile* my_free_list = free_list + FREELIST_INDEX(byte_left);//調(diào)整free list 將內(nèi)存池中的殘余空間全部編入到 free list里面((obj *)start_free)->free_list_link = *my_free_list;*my_free_list = (obj*) start_free;}//配置heap空間 用于填充內(nèi)存池start_free = (char*)malloc(bytes_to_get);if (0 == start_free){//heap空間不足 malloc失敗int i;obj* volatile * my_free_list,*p;//嘗試檢視手上具備的東西 這不會造成傷害 我們不打算進一步進行配置較小的區(qū)塊//因為在多進程的機器上容易導致災難//以下代碼的目的是搜尋適當( 尚有未用的區(qū)塊,且區(qū)塊夠大 )的free listfor (i = size;i <= __MAX_BYTES;i+- __ALIGN ) {my_free_list = free_list + FREELIST_INDEX(i);p = *my_free_list;if (p!=0){//free list 內(nèi)尚有未用的區(qū)塊//調(diào)整free list 釋放未使用的區(qū)塊*my_free_list = p->free_list_link;start_free = (char*)p;end_free = start_free + i;//遞歸調(diào)用自己 為了修正nobjsreturn (chunk_alloc(size,nobjs));//注意:任何殘余的領頭 終將被編入適當?shù)膄ree list中作為備用}}end_free = 0;//如果出現(xiàn)意外(山窮水盡 到處無內(nèi)存可以使用)//調(diào)用第一級配置器 寄希望于第一級配置器 希望out-of-memory機制可以出一份力start_free = (char*) malloc_alloc::allocate(bytes_to_get);//這會拋出異常(exception) 或內(nèi)存不足的情況獲得改善}heap_size += bytes_to_get;end_free = start_free + bytes_to_get;//遞歸調(diào)用自己 為了修正 nobjsreturn (chunk_alloc(size,nobjs));} }
  • 使用 end_free - start_free 判斷內(nèi)存池的容量,如果空間充足直接調(diào)出20個區(qū)塊返回給free_list
  • 如果不足20個 但是大于1個以上的容量 先提供可以滿足的區(qū)塊 ,遞歸更新 (pass by reference的nobjs修改為實際可以提供的區(qū)塊數(shù))
  • 如果一個都不可以滿足? 使用malloc從heap中配置內(nèi)存 為內(nèi)存池注入活水,新水量的大小是需求量的2倍,還需要加上隨著配置次數(shù)增加愈來愈大的附加量

  • 例子:假設程序一開始客戶端 就調(diào)用?chunk_alloc(32,20),此刻內(nèi)存池和free_list里面均沒有可用的內(nèi)存空間,所以使用malloc() 配置40個32byte區(qū)塊,使用malloc分配的內(nèi)存空間是需求的兩倍。其中第一個 32byte交出,19個給free_list [3] 進行維護,其余的20個留給內(nèi)存池。
  • 客戶端 使用?chunk_alloc(64,20),此刻free_list [7]沒有內(nèi)存 ,向內(nèi)存池提出申請 ;內(nèi)存池此刻具備的內(nèi)存 (32 * 20),所以只可以提供 (32 * 20)/64 = 10個64位區(qū)塊,返回10個區(qū)塊,第一個交給客戶端,剩余的9個由 free_list [7]。此刻內(nèi)存池全空
  • 客戶端調(diào)用chunk_alloc(96,20)此刻free_list [11]和內(nèi)存池全為空,需要使用malloc分配內(nèi)存,分配40+n個96bytes區(qū)塊,將第一個交出,另外19個交給free_list [11]維護,其余的20+n 的容量交給內(nèi)存池
  • 假設system heap空間不足了 (無法為內(nèi)存池注入 活水),malloc()行動失敗,chunk_malloc()就需要四處尋找合適的內(nèi)存。找到了就挖一塊,這個是從free_list上面去挖內(nèi)存,找不到就需要第一級配置器。
  • 第一級配置器本質(zhì)上還是使用malloc() 進行內(nèi)存的配置,考慮到前提 system heap已經(jīng)沒有內(nèi)存了,為啥同樣使用malloc這里就可以了呢?因為 第一配置器具備out-free-memory處理機制(類似new-handler機制) 就有機會去釋放其余地方多余的內(nèi)存,進行內(nèi)存的分配和使用。如果可以就成功,如果不可以就返回bad_malloc的異常。

注意事項:

template<class T,class Alloc> class simple_alloc{}; //SGI 通常使用這種方式來使用配置器 template<class T,class Alloc = alloc> //缺省使用alloc為配置器 class vector{ public:typedef T value_type; protected://專屬空間配置器 每次配置一個元素的大小typedef simple_alloc<value_type,Alloc>data_allocator; };
  • 其中 第二個template參數(shù)所接受的缺省參數(shù)值alloc 可以是第一級配置器 也可以是第二級配置器
  • 不過SGI STL已經(jīng)將其設定為第二級配置器?

完整代碼

#if 0 # include<new> # define __THROW_BAD_ALLOC throw bad_alloc #elif !defined(__THROW_BAD_ALLOC) # include<iostream> # define __THROW_BAD_ALLOC std::cerr << "out of memory" << std::endl; exit(1); #endif//malloc-based allocator 通常比稍后介紹的default alloc要慢 //但是它是線程安全的 thread-safe,并對于空間的運用比較高效 //以下是第一級別配置器 //無“template 型別參數(shù)” 至于非型別參數(shù) inst 完全沒有用到 template <int inst> class __malloc_alloc_template{ private://以下內(nèi)容都是函數(shù)指針,所代表的函數(shù)用于處理內(nèi)存不足的情況//oom : out of memorystatic void *oom_malloc(std::size_t);static void *oom_realloc(void*,std::size_t);static void (* __malloc_alloc_oom_handler)(); public:static void* allocate(std::size_t n){void * result = malloc(n);//第一級配置器 直接使用malloc進行內(nèi)存的分配//當無法滿足內(nèi)存分配的需求的時候,使用oom_malloc()if(result == 0){result = oom_malloc(n);}return result;}static void deallocate(void* p,size_t /* n */){free(p); //第一級配置器 直接使用 free()進行釋放}static void* reallocate(void* p,size_t /*old_size*/,size_t new_size){void *result = realloc(p,new_size); //第一級別配置器直接使用realloc()//以下無法滿足需求的時候 改用oom_realloc()if (0==result){result = oom_realloc(p,new_size);}return result;}//以下是仿真C++的set_new_handler(),換句話說 你可以通過他指定自己的out_of_handlerstatic void(*set_malloc_handler(void (*f)()))(){void (* old)() = __malloc_alloc_oom_handler;__malloc_alloc_oom_handler = f;return (old);}}; //malloc_alloc out_of_memory handling //初始化為0 template <int inst> void (* __malloc_alloc_template<inst>::__malloc_alloc_oom_handler)() = 0;template <int inst> void* __malloc_alloc_template<inst>::oom_malloc(std::size_t n) {void (*my_malloc_handler)();void * result;for(;;){ //不斷嘗試 釋放、配置、再次釋放、再次配置......my_malloc_handler = __malloc_alloc_oom_handler;if (0 == my_malloc_handler){__THROW_BAD_ALLOC;}(*my_malloc_handler)();//調(diào)用處理例程,企圖釋放內(nèi)存result = malloc(n); //再次配置內(nèi)存if (result){return result;}} }template <int inst> void *__malloc_alloc_template<inst>::oom_realloc(void *p, std::size_t n) {void (* my_malloc_handler)() = __malloc_alloc_oom_handler;void * result;if(0 == my_malloc_handler){__THROW_BAD_ALLOC;}(*my_malloc_handler)();//調(diào)用處理例程,企圖釋放內(nèi)存result = realloc(p,n);//再次嘗試配置內(nèi)存if (result){return result;} }//以下直接將參數(shù) inst 指定為0 typedef __malloc_alloc_template<0>malloc_alloc;enum {__ALIGN = 8}; //小型區(qū)塊的上調(diào)邊界 enum {__MAX_BYTES = 128};//小型區(qū)塊的上限 enum {__NFREELISTS = __MAX_BYTES/__ALIGN};//free-lists的個數(shù)using namespace std; //以下是第二級配置器 //注意:無 template型別參數(shù) 且第二參數(shù)哇怒氣按沒有被派上用場 //第一參數(shù)用于多線程的環(huán)境 本示例 暫未涉及 template <bool threads,int inst> class __default_alloc_template{ private://ROUND_UP() 將bytes上調(diào)至8的倍數(shù)static size_t ROUND_UP(size_t bytes){return (((bytes) + __ALIGN - 1) & ~(__ALIGN-1));}private:union obj{ //free-lists 節(jié)點構(gòu)造union obj * free_list_link;char client_data[1];// The client sees this}; private://16個free-listsstatic obj * volatile free_list[__NFREELISTS];//以下函數(shù)根據(jù)區(qū)塊的大小 決定使用第 n 號free-list,n從1開始算起static size_t FREELIST_INDEX(size_t bytes){return (((bytes) + __ALIGN-1)/__ALIGN-1);}//返回一個大小為n的對象 并可能加入大小為n 的其他區(qū)塊到free liststatic void* refill(size_t n);//配置一大塊區(qū)間 可以容納nobjs個“size”大小的區(qū)塊//如果配置nobjs個大小的區(qū)塊有所不方便 ,可以降低nobjsstatic char * chunk_alloc(size_t size,int &nobjs);//Chunk allocation statestatic char *start_free;//內(nèi)存池起始的位置 只在chunk_alloc()中變化static char *end_free;//內(nèi)存池結(jié)束的位置 只在chunk_alloc()中變化static size_t heap_size;public:static void* allocate(size_t n);static void deallocate(void* p,size_t n);static void *reallocate(void* p,size_t old_sz,size_t new_sz); };//以下是static data member 的定義與初值的設定 template <bool threads,int inst> char* __default_alloc_template<threads,inst>::start_free = 0;template <bool threads,int inst> char* __default_alloc_template<threads,inst>::end_free = 0;template <bool threads,int inst> size_t __default_alloc_template<threads,inst>::heap_size = 0;template <bool threads,int inst> typename __default_alloc_template<threads,inst>::obj * volatile __default_alloc_template<threads,inst>::free_list[__NFREELISTS] ={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};template <bool threads,int inst> void* __default_alloc_template<threads,inst>::allocate(size_t n) {obj* volatile *my_free_list;obj* result;//大于128就調(diào)用第一級配置器if(n>(size_t)__MAX_BYTES){return (malloc_alloc::allocate(n));}//尋找16個free lists中適當?shù)囊粋€my_free_list = free_list + FREELIST_INDEX(n);result = *my_free_list;if (result==0){//沒有找到free list,需要重新補充 free listvoid *r = refill(ROUND_UP(n));return r;}//調(diào)整free list*my_free_list = result->free_list_link;return result; }template <bool threads,int inst> void __default_alloc_template<threads,inst>::deallocate(void *p, size_t n) {obj *q = (obj*)p;obj *volatile * my_free_list;//大于128 就調(diào)用第一級配置器if(n > (size_t)__MAX_BYTES){malloc_alloc ::deallocate(p,n);return;}//尋找對應的free listmy_free_list = free_list + FREELIST_INDEX(n);//調(diào)整free list 回收區(qū)塊q->free_list_link = *my_free_list;*my_free_list = q; }//返回一個大小為n的對象,并且有的時候會適當?shù)奈籪ree list增加節(jié)點 //假設n已經(jīng)上調(diào)為8的倍數(shù) template <bool threads,int inst> void* __default_alloc_template<threads,inst>::refill(size_t n) {int nobjs = 20;//調(diào)用chunk_alloc() 嘗試獲取nobjs個區(qū)塊作為free list的新的節(jié)點//注意參數(shù)nobjs是pass by reference的方式char* chunk = chunk_alloc(n,nobjs);obj* volatile * my_free_list;obj* result;obj* current_obj,*next_obj;int i;//如果只獲得一個區(qū)塊 這個區(qū)塊就會被分配給調(diào)用者使用 free list無新的節(jié)點if (1 == nobjs){return chunk;}//否則準備調(diào)整free list 納入新的節(jié)點my_free_list = free_list + FREELIST_INDEX(n);//在chunk空間內(nèi) 建立free listresult = (obj*) chunk; //這一塊準備返回給客戶端//以下導引free list指向新的配置的空間(取自內(nèi)存池)*my_free_list = next_obj = (obj*)(chunk +n);//以下將free list的各個節(jié)點串接起來for(i=1;;i++){ //從1開始 因為第0個將會返回給客戶端current_obj = next_obj;next_obj = (obj*)((char *)next_obj + n);if (nobjs-1==i){current_obj->free_list_link = 0;break;} else{current_obj->free_list_link = next_obj;}}return (result); }//假設n已經(jīng)上調(diào)為8的倍數(shù) //注意參數(shù)nobjs是pass by reference /** size:每一個objs的大小+* nobjs:創(chuàng)建objs的數(shù)量*/ template <bool threads,int inst> char* __default_alloc_template<threads,inst>::chunk_alloc(size_t size, int &nobjs) {char* result;size_t total_bytes = size * nobjs;size_t byte_left = end_free - start_free;//內(nèi)存池剩余空間if (byte_left >= total_bytes){//內(nèi)存池的空間滿足需求量result = start_free;start_free += total_bytes;return result;} else if(byte_left >= size){}}

參考鏈接

  • STL 源碼剖析 空間配置器_CHYabc123456hh的博客-CSDN博客

總結(jié)

以上是生活随笔為你收集整理的STL源码剖析 空间配置器 查漏补缺的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

正在播放久久 | 天天综合网国产 | 午夜av在线免费 | 欧美 日韩 成人 | 97av影院 | 韩国av一区二区三区在线观看 | 99精品国产兔费观看久久99 | 日韩专区在线观看 | 国产高清在线免费观看 | 日韩美在线观看 | 国产夫妻av在线 | 亚洲色图27p | 五月婷婷久久丁香 | 黄视频网站大全 | 日本久久精品视频 | 人人澡人摸人人添学生av | 国产另类av | 国内偷拍精品视频 | 亚洲另类交 | 97视频网站 | 五月天高清欧美mv | 西西444www高清大胆 | 在线观看免费一区 | 国产精品青草综合久久久久99 | 婷婷在线精品视频 | 国产亚洲精品成人av久久影院 | 欧美成天堂网地址 | 亚洲韩国一区二区三区 | 免费日韩 精品中文字幕视频在线 | 亚洲午夜久久久影院 | 国产91亚洲 | 国产精品久久久电影 | 天天操天天操天天爽 | 草久草久 | 久久亚洲免费 | 日韩试看 | 国产美女久久 | 视频一区二区在线观看 | 中文在线最新版天堂 | 91看片一区二区三区 | 色爽网站 | 91爱看片 | 在线国产小视频 | 亚洲闷骚少妇在线观看网站 | 亚洲精品国偷自产在线99热 | 五月天堂网 | 免费一级特黄毛大片 | 日韩中文字幕免费在线观看 | 欧美激情视频一区 | 亚洲aⅴ一区二区三区 | 国产欧美精品在线观看 | 五月开心六月婷婷 | 久久99亚洲精品久久 | 亚洲精品一区二区18漫画 | 中文字幕一区二区三区四区久久 | 欧美日韩高清一区二区 国产亚洲免费看 | 又黄又刺激又爽的视频 | 亚洲综合涩 | 国产精品毛片一区视频播 | 久久精品导航 | 日本少妇高清做爰视频 | 久久精品综合视频 | 国产综合精品一区二区三区 | 精品久久国产 | 国产精品女同一区二区三区久久夜 | 久草精品在线播放 | 中文字幕亚洲字幕 | 精品久久久久久国产91 | 中文字幕xxxx | 久草在线最新 | 国产在线国偷精品产拍免费yy | 九九久久久久久久久激情 | 国产精品一区二区三区电影 | 91亚洲精 | 中文字幕文字幕一区二区 | 色综合婷婷久久 | av在线电影免费观看 | 337p西西人体大胆瓣开下部 | 欧美日韩午夜在线 | 国产美女精彩久久 | 91在线视频在线观看 | 成人在线视频观看 | 91社区国产高清 | 一级黄色网址 | 日韩免费不卡av | 欧美精品乱码久久久久久 | 天天在线操 | 欧美激情综合五月色丁香小说 | 免费男女羞羞的视频网站中文字幕 | 久久久网址| 婷婷播播网 | 国产97在线播放 | 久久国产精品视频观看 | 黄色在线成人 | 91九色蝌蚪视频 | 国产精品视频免费在线观看 | 狠狠激情中文字幕 | 在线黄频 | 午夜视频一区二区三区 | 麻豆传媒在线免费看 | 国内外成人在线视频 | 激情婷婷亚洲 | 人人澡人人草 | 高清av在线免费观看 | 开心色停停| 一区二区理论片 | 欧美日韩视频网站 | 久久久久亚洲精品成人网小说 | 爱爱一区 | 日韩黄色中文字幕 | 国精产品永久999 | 久久综合精品国产一区二区三区 | 天天躁日日躁狠狠躁 | 正在播放国产精品 | 日韩国产精品毛片 | 久久久免费看片 | 毛片永久免费 | 狠狠躁夜夜a产精品视频 | 亚洲视频1| 亚洲在线成人精品 | 欧美va天堂va视频va在线 | 97网| 国产高清不卡av | 国产精品美女视频网站 | 欧美怡红院视频 | 欧美一级小视频 | 99久久久久免费精品国产 | 日韩久久午夜一级啪啪 | 久久夜色精品国产欧美乱极品 | 免费色av | 91视频88av | 久久亚洲二区 | 国产精品va在线观看入 | 色综合天天色综合 | 国产视频二区三区 | 国产小视频在线观看 | 草久久精品 | 久草免费资源 | 五月天.com | 91成人国产 | 婷婷六月中文字幕 | 日韩三级av | 天天综合狠狠精品 | 欧美综合色 | 黄色大全免费网站 | 一区二区欧美在线观看 | 精品视频一区在线 | 中文字幕文字幕一区二区 | 天天伊人网 | 国产精品亚洲精品 | 五月婷婷影视 | 五月婷婷在线综合 | 欧美日韩精品在线观看 | 激情综合网五月激情 | 欧美一级在线观看视频 | 久久久精品视频成人 | 视频一区在线免费观看 | 国产免费又爽又刺激在线观看 | 91精品视频免费看 | 日韩欧美视频免费看 | 91香蕉视频| 中文字幕日韩无 | 日韩欧美99 | 91久久奴性调教 | 在线播放视频一区 | 国产在线精品播放 | 欧美久草网| 色干干| 国产精品18毛片一区二区 | 国产小视频你懂的在线 | 天天草av| 在线激情小视频 | 精品国产不卡 | 久久久福利视频 | 国产四虎影院 | 996久久国产精品线观看 | 国产精品久久9 | 黄色成年片 | 日韩午夜精品福利 | 在线免费观看国产 | 日韩伦理片hd | 最近中文字幕免费av | 国产色视频一区二区三区qq号 | 免费观看www视频 | 久久人人精品 | 在线看片一区 | 在线观看黄色av | 二区视频在线 | 午夜的福利 | 欧美日韩首页 | 国产日韩欧美视频在线观看 | 精品亚洲网 | 欧美日本在线视频 | 久久久精品久久 | 国产91全国探花系列在线播放 | 91久久精品一区二区二区 | 亚洲国产成人久久综合 | a黄色| 国产美腿白丝袜足在线av | 五月开心激情 | 在线黄频| 91人人网 | 国产成人精品一二三区 | 2021久久| 91最新网址在线观看 | 五月天久久综合 | 特级大胆西西4444www | 成人免费共享视频 | 一区在线观看视频 | 国产精品久久久久久久久蜜臀 | 一区二区在线影院 | 日韩免费电影网 | 人人玩人人爽 | 成人黄色一级视频 | 午夜三级影院 | 九九九国产 | 成人免费xyz网站 | 在线观看免费一区 | 日韩视频二区 | 婷婷av综合 | 欧美日韩一区二区视频在线观看 | 韩国av一区 | 国产成人福利片 | 国产精品一区二区三区观看 | 一级一片免费观看 | 免费91在线观看 | 久久在线免费视频 | 91网在线 | 欧美一级电影在线观看 | 午夜视频在线观看一区二区 | 午夜免费福利视频 | 婷婷日韩 | 最近中文字幕在线播放 | 在线视频手机国产 | 免费人成网 | 久久中文精品视频 | 日韩精品久久久久久久电影99爱 | 国产九色在线播放九色 | 中文字幕av网站 | 亚洲作爱视频 | 国产免费专区 | 婷婷丁香av | a级片韩国 | 日韩中文在线电影 | 一级特黄aaa大片在线观看 | 欧美日韩一区二区在线观看 | 91精品久久久久久久久 | 97视频入口免费观看 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 蜜臀久久99精品久久久酒店新书 | 色操插 | 日韩国产精品久久久久久亚洲 | 天堂在线视频中文网 | 国产伦理久久 | 欧美一区二区三区四区夜夜大片 | 高清不卡免费视频 | 91麻豆精品91久久久久同性 | 国产午夜精品一区二区三区 | 国产成人一区二区三区在线观看 | 成人h在线播放 | 日韩欧美一区二区三区免费观看 | 超碰在线日韩 | 91精品国产福利在线观看 | 6080yy午夜一二三区久久 | 日日摸日日爽 | 成人免费xxxxxx视频 | 婷婷色婷婷 | 国产成人精品午夜在线播放 | 久久影视网| 亚洲电影免费 | 日本精a在线观看 | 超碰av在线 | 天天操天天干天天 | 日韩国产精品一区 | 综合天天 | 久久五月天综合 | 黄色不卡av | 色之综合网 | 一区二区三区动漫 | 亚洲精品动漫成人3d无尽在线 | 99国产精品视频免费观看一公开 | 欧美精品亚洲精品 | 在线免费试看 | 伊人色综合久久天天网 | 国产色女人 | 色先锋av资源中文字幕 | 国产电影黄色av | 在线观看av免费观看 | 黄色国产区| 久草在线官网 | 91经典在线| 麻豆视频观看 | 91在线观看欧美日韩 | 成人sm另类专区 | 久草在线最新视频 | 97福利 | 国产中文在线播放 | 日韩欧美视频一区二区 | 国产精品久久久久久久99 | 91视频黄色 | 一区精品久久 | 成人午夜黄色 | 久久精品国产成人精品 | 婷香五月 | 在线播放 亚洲 | 色天天综合久久久久综合片 | www九九热| 久草在线手机视频 | 婷婷综合五月天 | 成人免费视频观看 | 涩涩网站在线观看 | 五月天com| 99999精品视频 | 欧美成人精品三级在线观看播放 | 欧美日韩综合在线 | 一区二区三区免费在线观看视频 | 四虎5151久久欧美毛片 | 久草青青在线观看 | 特级免费毛片 | 美州a亚洲一视本频v色道 | 中文字幕色在线视频 | 91精品伦理| 免费男女羞羞的视频网站中文字幕 | 91精品国产欧美一区二区 | 99精品一区二区三区 | 免费大片黄在线 | 国产在线播放一区 | 国产精品尤物视频 | 最近中文字幕完整高清 | 日韩二区三区在线 | 精品国偷自产国产一区 | a黄色大片 | 免费视频黄色 | 亚洲综合色视频 | www.亚洲| 久久国产精品99久久久久久老狼 | 97福利社| a精品视频 | 天天操天天综合网 | 在线观看av网站 | 亚洲国产高清在线观看视频 | 欧美午夜精品久久久久 | av网站播放| 亚洲成a人片77777潘金莲 | 在线视频观看国产 | 国产精品ssss在线亚洲 | 五月天亚洲婷婷 | 在线免费成人 | 91男人影院 | 亚洲激情精品 | 99国产精品久久久久老师 | 国产精品久久久久aaaa | 黄色软件在线观看免费 | 黄色看片| 在线91色 | 免费无遮挡动漫网站 | www.夜夜操.com | 精品一区二区久久久久久久网站 | 国产精品免费一区二区三区 | 欧洲精品视频一区 | 日日日干 | 国产最顶级的黄色片在线免费观看 | 91在线视频观看 | 精品免费一区 | 亚洲视频h | 久久久久久电影 | 91av在线免费看 | 免费网站黄色 | 亚洲成年人免费网站 | 中文字幕免费高清 | 亚洲爱爱视频 | 制服丝袜天堂 | 国产精品久久久久久久久久直播 | 欧美成人h版在线观看 | 日日干综合 | 色综合天天综合 | 国产成人av福利 | 亚洲最大免费成人网 | 丁香午夜| 天天爽综合网 | 91精品电影| 97超碰人人 | 国产精品久久嫩一区二区免费 | 久久精品99 | 亚洲国产欧美在线看片xxoo | 日韩av中文在线 | 人人狠狠综合久久亚洲 | 久草干| 性色在线视频 | 久操中文字幕在线观看 | 久久综合欧美精品亚洲一区 | 亚洲天堂社区 | 粉嫩av一区二区三区四区在线观看 | 久久久久国产成人精品亚洲午夜 | 久久综合九色综合久99 | 夜夜骑天天操 | 激情综合五月天 | 免费看的视频 | 永久黄网站色视频免费观看w | 久草视频在线看 | 久久综合狠狠综合久久狠狠色综合 | 永久免费视频国产 | 久久久久久草 | 国产又粗又猛又黄视频 | 激情婷婷综合网 | 色av婷婷 | 久久亚洲免费视频 | 久久天| 日韩激情视频在线观看 | 日韩av免费大片 | avcom在线| 亚洲区另类春色综合小说 | 视频一区久久 | 久久精品女人毛片国产 | 国产网站在线免费观看 | 日韩精品字幕 | 欧美另类视频 | 久草在线欧美 | 麻豆成人在线观看 | 黄色免费视频在线观看 | 国产免费一区二区三区网站免费 | 黄色大片日本免费大片 | 五月婷婷丁香网 | 免费看成人 | 蜜臀av性久久久久av蜜臀妖精 | 综合黄色网| 日韩视频欧美视频 | 91九色免费视频 | 午夜精品电影 | 久久国产亚洲视频 | 亚洲色视频 | 天天操网 | 国产特级毛片aaaaaa毛片 | 美女免费视频一区 | 欧美日韩性生活 | 色婷婷综合久久久 | 亚洲少妇自拍 | 日本不卡一区二区三区在线观看 | 播五月婷婷 | 天天综合网 天天 | 亚州成人av在线 | 中文字幕精品久久 | 亚洲另类视频在线 | 91热在线 | 一区二区三区在线观看免费视频 | 国内久久久久 | 久草在线视频首页 | 久99精品| 久草视频免费 | 国产高清免费在线播放 | 精品国产一区二 | 91福利视频网站 | 日本女人逼 | 精品国产免费av | 在线免费视| 一区视频在线 | 日韩特级黄色片 | 五月开心六月婷婷 | 日韩精品短视频 | 三级av在线免费观看 | 999视频在线播放 | 欧洲成人免费 | 欧美老女人xx | 色婷婷国产精品一区在线观看 | 国产亚洲精品久久久网站好莱 | 激情 亚洲 | 日本电影久久 | 天天拍天天爽 | 97av影院 | 午夜精品区 | 久久午夜色播影院免费高清 | 99精品国产99久久久久久97 | 成年人电影免费看 | 亚洲精品麻豆视频 | 日韩午夜剧场 | 国产日韩精品一区二区 | www.狠狠色| 久久精品99视频 | 六月丁香社区 | 又黄又爽又刺激 | 又湿又紧又大又爽a视频国产 | av中文字幕日韩 | 日韩精品视频久久 | 亚洲妇女av| 精品国产精品久久 | 天天操天天干天天操天天干 | 婷婷色综合| 天天干夜夜 | 欧美日韩二区三区 | 欧美日本三级 | 欧美一级片在线播放 | 亚洲综合色婷婷 | 亚洲三级在线播放 | 欧美黄污视频 | 成人免费 在线播放 | 激情五月在线视频 | 97国产一区 | 日韩av影视在线 | 人人澡av | 亚洲精品乱码久久久久久 | 亚洲黄色在线免费观看 | 免费能看的av | 国产精品久久久久久久久久久久久 | www免费视频com| 午夜久久久久久久久久影院 | 操操色 | 亚洲一二三久久 | 天天爽夜夜爽精品视频婷婷 | 欧美日韩在线观看视频 | 婷婷色网址| 久久这里有精品 | 爱av在线网 | 欧美日韩中文国产一区发布 | 最近高清中文字幕在线国语5 | 日日干天天 | 日韩在线观看视频免费 | 国产精品免费观看在线 | 男女视频国产 | 国产美女精品人人做人人爽 | 欧美日本在线视频 | 91精品国自产在线观看欧美 | 欧美日韩天堂 | 中文国产字幕在线观看 | 综合久久五月天 | 在线观看亚洲精品 | 日韩免费在线一区 | 操久久免费视频 | 久久久国产一区二区三区四区小说 | 99精彩视频在线观看免费 | 99精品视频在线看 | 欧美爽爽爽 | 国产精品一区二区三区四区在线观看 | 91麻豆精品国产91久久久使用方法 | 精品一区二区免费视频 | 中文字幕无吗 | 久久九九影视网 | 国产精品s色 | 一区二区不卡在线观看 | 亚洲成人黄色 | 精品在线亚洲视频 | 婷婷久久婷婷 | 在线免费观看的av网站 | 国产69精品久久99的直播节目 | 久久99欧美| 日韩午夜电影网 | 91久久丝袜国产露脸动漫 | www.亚洲| 99热这里| 亚洲国产精品久久 | 国产91九色蝌蚪 | 人人草天天草 | 97超碰.com| 永久中文字幕 | 免费观看黄色av | 91香蕉视频720p | 激情婷婷在线 | 黄色成年片 | 黄色av在| 久久a免费视频 | 国产精品欧美在线 | 一区二区电影在线观看 | 国产h片在线观看 | 久久黄色小说视频 | 久久久久成人精品 | 天堂av最新网址 | 天天做天天看 | 免费看片黄色 | 久久免费黄色 | 久久精品999| 久久毛片网 | 国产精品高潮呻吟久久久久 | 在线国产视频一区 | 亚洲做受高潮欧美裸体 | 蜜臀aⅴ国产精品久久久国产 | 99欧美精品 | 玖玖在线观看视频 | 五月天婷亚洲天综合网鲁鲁鲁 | 国产欧美中文字幕 | 欧美一区二区日韩一区二区 | 九色精品免费永久在线 | 久久免费大片 | 日韩免费电影在线观看 | 深爱激情亚洲 | 日韩精品一区二区免费视频 | 色婷婷综合久久久久中文字幕1 | 天天干亚洲 | 欧美极品久久 | 午夜精品视频福利 | 激情久久综合 | 免费在线国产黄色 | 午夜视频免费在线观看 | 日韩激情免费视频 | 在线亚洲人成电影网站色www | 亚洲九九九在线观看 | av一级片在线观看 | 精品久久久久免费极品大片 | 国产高清99| 中文字幕精品一区久久久久 | 欧美精品中文 | 深爱激情五月综合 | 亚洲国产精品一区二区尤物区 | 狠狠躁日日躁 | 国产精品久久久久永久免费 | 一级成人免费视频 | 黄色成人在线网站 | 久久人人97超碰国产公开结果 | 国内成人精品视频 | 一区二区视频免费在线观看 | 久久国产精品第一页 | 免费在线观看国产黄 | 91精彩视频在线观看 | 国产1区2区3区精品美女 | 超碰免费在线公开 | 一区二区三区在线观看中文字幕 | 狠狠综合久久av | 国产高清无av久久 | 日韩综合一区二区三区 | 国内亚洲精品 | 9797在线看片亚洲精品 | 2018好看的中文在线观看 | 国产精品久久久久久久久毛片 | av黄网站 | 黄色三级免费 | 久草在线观看视频免费 | www.久久婷婷 | 国产一及片 | 亚洲精品在线观 | 天天干天天操天天搞 | 夜色资源站国产www在线视频 | 中文字幕在线人 | 免费福利在线视频 | 国产一区二区三区网站 | 亚洲成a人片在线www | 日韩理论片在线观看 | 精品亚洲免费视频 | 午夜久久视频 | 久久99国产综合精品免费 | 久久小视频| 久久久久久视频 | 色视频国产直接看 | 五月婷婷综合激情网 | 亚洲精品乱码久久久久久高潮 | 免费大片av | 国产成人福利在线观看 | 中文字幕av在线免费 | 香蕉久久久久久久 | 天天综合天天综合 | 日本中文字幕电影在线免费观看 | 视频在线91| 91女人18片女毛片60分钟 | 99一级片 | 91豆麻精品91久久久久久 | 丁香视频五月 | 一区二区三区视频网站 | 99欧美 | 一级一片免费视频 | 国产激情电影综合在线看 | 日韩免费在线观看视频 | 91视频3p | 天天操天天添 | 激情五月在线视频 | 久久特级毛片 | 久久久久久久久综合 | 亚州精品国产 | 日韩理论在线观看 | 久久91久久久久麻豆精品 | 欧美专区国产专区 | 天天色天天草天天射 | 中文永久免费观看 | 国产精品久久久久久久久久久杏吧 | 天天操操| 久久久久久欧美二区电影网 | 成人av免费在线观看 | 国产一区二区三区高清播放 | 韩国av三级 | 超级碰碰免费视频 | 欧美激精品 | 十八岁以下禁止观看的1000个网站 | 欧美日韩一级视频 | 色网站在线免费 | 人人藻人人澡人人爽 | 国产精品嫩草影院123 | 免费在线观看成人av | 蜜桃av久久久亚洲精品 | 午夜视频免费在线观看 | 免费色黄 | 992tv人人网tv亚洲精品 | 91高清免费看 | 久久久久久久久久亚洲精品 | 丁香一区二区 | 久热久草在线 | 久草视频国产 | 国产高清视频免费最新在线 | 最近高清中文在线字幕在线观看 | 亚洲免费视频在线观看 | 中文字幕丰满人伦在线 | 99精品一区二区三区 | 日日夜精品 | 久草在线手机观看 | 日韩精品在线免费观看 | 狠狠色婷婷丁香六月 | 一区二区三区影院 | 97在线观看免费 | 成年人免费电影在线观看 | 国产在线色站 | 在线免费黄色av | 99热这里只有精品久久 | 天天躁天天躁天天躁婷 | 久久九精品 | av动态图片 | 中文字幕一区二区三区乱码不卡 | 国产黄色片在线免费观看 | 国产成人精品亚洲 | 久久免费视频在线观看30 | 日韩黄色免费电影 | 91黄色免费看 | 西西www444| 丁香六月婷婷开心 | 日韩三级久久 | 久久精品久久久精品美女 | 日韩在线中文字幕视频 | 在线观看免费观看在线91 | 国产精品国产三级国产aⅴ9色 | 久久艹免费 | 9999国产精品 | 日韩激情网 | 在线免费性生活片 | 免费亚洲视频 | 欧美日韩另类视频 | 免费观看视频黄 | 欧美日韩国语 | 91一区一区三区 | 色综合久久久久网 | 精品极品在线 | 久草视频在线免费播放 | 在线观看国产成人av片 | 日韩午夜视频在线观看 | 国产日韩欧美自拍 | 国产精品久久网 | 五月婷婷网站 | 免费十分钟 | 国产精品精品国产 | 国产精品1024 | 亚洲一级电影在线观看 | 欧美黑人性猛交 | 91大神免费视频 | 一区二区三区四区五区在线视频 | avsex| 成人免费视频网 | 草免费视频 | 456免费视频| 国产在线观看国语版免费 | 国产一级久久久 | 中文字幕在线免费97 | 99久高清在线观看视频99精品热在线观看视频 | 日韩欧美xx | 色丁香综合| 国产免费精彩视频 | 亚洲成人av电影 | 亚洲高清色综合 | 久久综合色影院 | 丁香六月天 | 成人在线视频免费看 | 国产精品一区二区在线免费观看 | 91亚色免费视频 | 91精品国产99久久久久 | 97精品国产一二三产区 | 黄色片毛片 | 久草视频在线免费播放 | 中文字幕第一页在线视频 | 日韩在线观看影院 | 精品国产精品一区二区夜夜嗨 | 久久久麻豆视频 | 久草在线手机视频 | 亚洲五月综合 | 日韩免费一区二区在线观看 | 97香蕉久久超级碰碰高清版 | av免费电影网站 | 天天色天天草天天射 | 亚洲一区网站 | 成人午夜久久 | 在线av资源 | 成 人 黄 色 视频免费播放 | 久久成人精品 | 色大片免费看 | 少妇bbbb揉bbbb日本 | 中文在线8资源库 | 91av资源在线| 免费在线成人 | 久久精品区 | 成人免费看黄 | 日韩中文三级 | 久久视频在线观看免费 | 中文在线a在线 | www天天干com | 午夜国产一区二区 | 在线黄色国产电影 | 国产亚洲视频在线免费观看 | 国产裸体视频网站 | 午夜精品av | 日韩一级片网址 | 男女啪啪视屏 | 欧美日高清视频 | 久久久国产精品一区二区三区 | 国产一区二区三区在线 | 婷婷av综合 | 精品一区二区免费在线观看 | 99久久久久久久 | 久久久国产精品久久久 | 日韩一区二区三区免费视频 | 深爱婷婷网 | 激情综合色播五月 | 超碰人人av | 国产精品一区二区三区在线 | 超碰97人人射妻 | 99久久久久国产精品免费 | 国产精品第二十页 | 天天草天天插 | 欧美高清视频不卡网 | 狠狠色丁香婷婷综合久小说久 | 欧美人体xx | 国产高清av免费在线观看 | 一级欧美日韩 | 欧美日韩亚洲在线观看 | 中文字幕网址 | 久久不卡国产精品一区二区 | 五月天婷亚洲天综合网精品偷 | 视频一区在线免费观看 | 国产中文字幕视频在线 | 一级片视频在线 | 国产91亚洲| 精品国产aⅴ一区二区三区 在线直播av | 亚洲国产精品成人va在线观看 | 99久久久久久久久 | 日操操 | 国产精品国产三级国产专区53 | 97热久久免费频精品99 | 激情五月婷婷综合 | 欧美精品视 | 97影视 | 99精品视频在线观看视频 | 国产成人久久精品一区二区三区 | 九色琪琪久久综合网天天 | av在线免费观看网站 | 亚洲国产成人在线 | 999久久久久久久久6666 | 欧美坐爱视频 | 97在线观看免费高清 | 中文字幕第 | 中文国产字幕在线观看 | 亚洲精品www. | 国精产品一二三线999 | av黄色免费在线观看 | 国产精品成人a免费观看 | 中文字幕亚洲国产 | 四虎成人精品永久免费av | 国产免费黄视频在线观看 | 国产在线观看午夜 | 中文字幕888 | 香蕉视频18 | 91久久在线观看 | zzijzzij日本成熟少妇 | 伊人狠狠色丁香婷婷综合 | 国产在线资源 | 色综合久久88色综合天天人守婷 | 免费日韩一区二区三区 | 亚洲天堂视频在线 | 亚洲欧美日韩国产精品一区午夜 | 久久国产精品久久精品 | 99视频在线观看免费 | www.久久久com| 亚洲天堂网在线视频 | 成人观看视频 | 国产精品免费观看视频 | 久久久18 | 99九九视频 | 国产麻豆果冻传媒在线观看 | 亚洲成人资源 | 亚洲日本国产精品 | 99精品国产99久久久久久97 | 成人91在线| 亚洲精品乱码久久久久久 | 中文字幕日韩一区二区三区不卡 | 国产一区二区三精品久久久无广告 | 欧美日韩视频一区二区 | 色婷婷综合在线 | 视频在线在亚洲 | 中文在线a天堂 | 99久久www免费 | 日韩精品高清不卡 | 亚洲在线网址 | 天天操天天干天天综合网 | 亚洲精品视频在线免费播放 | 亚洲一区视频在线播放 | www.伊人网| 国产精品午夜久久 | 97免费在线观看 | 91成年视频 | 涩涩在线 | 日韩va在线观看 | avwww在线 | 色国产视频| 亚洲一区天堂 | 亚洲一区二区高潮无套美女 | 三级黄色片子 | 久久福利| 五月激情姐姐 | 日韩一级片观看 | 色91在线视频 | 在线看片a| 天天爽夜夜爽精品视频婷婷 | 久久国产精品免费一区二区三区 | 亚洲日本韩国一区二区 | 在线观看黄网 | 99久在线精品99re8热视频 | 中文字幕一区二区三区四区久久 | 国产盗摄精品一区二区 | 日韩一级成人av | 综合天天| 黄色av一级 | 久久久国产精华液 | 中文字幕在线观看一区二区三区 | 欧美色精品天天在线观看视频 | 丁香六月婷 | 999久久久久久久久 69av视频在线观看 | 亚洲国产精品一区二区尤物区 | 亚洲国产精品一区二区久久,亚洲午夜 | 久久国产精品99久久久久久老狼 | 国产九色视频在线观看 | 久久成人亚洲欧美电影 | 国产免费不卡av | 九九爱免费视频 | 天堂av在线网址 | 99精品视频在线播放观看 | 亚洲综合色播 | 色综合网在线 | 午夜免费在线观看 | 亚洲一二视频 | 免费中午字幕无吗 | 黄色免费观看 | 国产精品青青 | 日韩理论电影在线 | 中文字幕第一页在线视频 | 午夜精品久久久久99热app | www最近高清中文国语在线观看 | 日躁夜躁狠狠躁2001 | 午夜av电影院 | 色网站在线看 | 夜夜高潮夜夜爽国产伦精品 | 日日干,天天干 | 亚州国产精品久久久 | 久久99热这里只有精品国产 | 可以免费观看的av片 | 99九九视频| 亚洲亚洲精品在线观看 | 激情网第四色 | 久久精品中文字幕免费mv | 五月婷在线播放 | 91九色蝌蚪视频网站 | 亚洲 欧美 综合 在线 精品 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 精品伊人久久久 | 黄色av电影在线 | 午夜国产福利视频 | 在线观看爱爱视频 | 中文字幕乱在线伦视频中文字幕乱码在线 | www国产亚洲精品久久网站 | 亚洲午夜久久久久久久久久久 | 国产aaa大片| 人人干狠狠操 | 欧美黄网站 | 国产综合婷婷 | 国产日韩欧美在线影视 | 欧美成人h版电影 | 超碰在线最新网址 | 超碰97免费 | 波多野结衣日韩 | v片在线播放 | 91在线免费看片 | 成年人免费观看在线视频 | 国产精品一区二区电影 | 婷婷丁香狠狠爱 | 欧美 亚洲 另类 激情 另类 | 干综合网 | 色欧美日韩 | 天天综合中文 | 精品亚洲欧美一区 | 亚洲精品玖玖玖av在线看 | 天天操天天操天天干 | 日韩视频在线不卡 | 国产精品mm | 99这里只有精品99 | 天天干天天做 | 日韩精品在线免费播放 | 婷婷激情5月天 | 99热在| 久久国产精品99久久久久 | www.色就是色 |