• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            MyMSDN

            MyMSDN記錄開發新知道

            共2頁: 1 2 
            @bob
            我不知道您說的部分言語是哪些?另外你覺得換個什么標題比較好呢?
            @溪流
            是,本文要說的就是這個
            @xxoo
            wProcessorArchitecture
            The processor architecture of the installed operating system.
            re: [C++]內存管理(1) volnet 2010-07-08 11:08
            @zuhd
            因為我的代碼用到STL的東西,所以現在替換全局new,似乎還有問題……悲劇
            re: [C++]內存管理(1) volnet 2010-07-08 11:07
            @zuhd
            感謝您的回復。
            1、我和智能指針要解決的應該是相同的問題,另外我還希望能夠解決一些碎片相關的問題,雖然現在還沒有做具體的代碼和設計。但是如果我接管了new或者部分new的話,我就有辦法去管理它們,并且動一點手腳了。現在關于是否每個分配都有正確的釋放,這一點我暫時不做太多考慮了,我們現在基本用shared_ptr來做,這里就有一個問題了,我希望用我的內存分配機制去替換shared_ptr的對象存儲。考慮下面的代碼shared_ptr sp_(new MyClass()); 其實內存還是通過默認的operator new去分配的內存,這個內存通常是直接向操作系統去調用的,我現在希望有一塊較大的內存,然后所有小塊的內存分配我都希望自己來管理,而不用每次都向操作系統申請。但是現在shared_ptr在發揮作用前就已經通過new去做了內存分配,顯然我自造shared_ptr是無法解決這個問題的。我不知道有沒有辦法轉存那塊內存,并立即釋放掉,比如在內部通過memmove將向系統new出來的部分拷貝到我的構造中,然后將它們釋放,這樣我就不用替換全局的new來管理與shared_ptr有關的內存了。因為我們的代碼中大部分用到了shared_ptr,所以此法能解決比較多的問題。
            2、是否有其他的建議呢?
            re: [C++]內存管理(1) volnet 2010-07-07 15:15
            已經更新下載代碼中的測試用例,現在的測試更加復雜,更具有一般性,歡迎大家下載體驗,程序有些許改動,詳見上一條回復:
            [移除prev_chunk,next_chunk,新增near_chunk,修改remove_chunk]
            源代碼下載地址不變。
            源代碼下載:
            http://m.shnenglu.com/Files/mymsdn/memory_manager.rar
            re: [C++]內存管理(1) volnet 2010-07-07 15:08
            移除prev_chunk,next_chunk,新增near_chunk,修改remove_chunk
            方法有更新,更新內容:

            BOOL memory_manager::near_chunk(block_table_type &list, int offset, OUT chunk_type * prevChunk, OUT chunk_type * nextChunk)
            {
            block_table_type::iterator itPrev;
            block_table_type::iterator itNext;

            if(prevChunk == 0 || nextChunk == 0)
            return FALSE;
            else
            {
            prevChunk->status = Occupied;
            nextChunk->status = Occupied;
            }
            if(list[offset].hHeap == 0)
            return FALSE;
            block_table_type::iterator it = list.find(offset);
            if(it == list.end())
            return FALSE;

            itPrev = list.end();
            itNext = list.end();

            if(it != list.begin())
            {
            itPrev = --it;
            ++it;
            }

            if(it != list.end())
            {
            itNext = ++it;
            --it;
            }

            if(itPrev != list.end())
            {
            prevChunk->hHeap = (itPrev)->second.hHeap;
            prevChunk->pHead = (itPrev)->second.pHead;
            prevChunk->size = (itPrev)->second.size;
            prevChunk->status = (itPrev)->second.status;
            }

            if(itNext != list.end())
            {
            nextChunk->hHeap = (itNext)->second.hHeap;
            nextChunk->pHead = (itNext)->second.pHead;
            nextChunk->size = (itNext)->second.size;
            nextChunk->status = (itNext)->second.status;
            }
            if(itPrev != list.end() || itNext != list.end())
            return TRUE;
            return FALSE;
            }
            void remove_chunk(int heapIndex, int offset)
            {
            chunk_type prevFreeChunk, nextFreeChunk;
            if( near_chunk(heap_list[heapIndex].full_list, offset, &prevFreeChunk, &nextFreeChunk) )
            {
            // a) 前項檢測:
            // 前一項如果為Free,將前項size+=當前項size,刪除當前項。
            if(prevFreeChunk.status == Free && nextFreeChunk.status != Free)
            {
            int prevOffset = static_cast(prevFreeChunk.pHead) - static_cast(heap_list[heapIndex].pHead);
            free_chunk_list_remove(heap_list[heapIndex].full_list[prevOffset].size, heap_list[heapIndex].hHeap);
            heap_list[heapIndex].full_list[prevOffset].size += heap_list[heapIndex].full_list[offset].size;
            free_chunk_list_add(heap_list[heapIndex].full_list[prevOffset].size, heap_list[heapIndex].hHeap);
            int eraseSucceed = heap_list[heapIndex].full_list.erase(offset);
            #ifdef _DEBUG
            // 如果移除偏移不等于1個
            if( eraseSucceed != 1)
            {
            _TRACE(_W("從完全列表中移除對象出現異常,移除offset為%d,移除個數為%d.\n"), offset, eraseSucceed);
            }
            _TRACE(_W("執行前項檢測且前項狀態為空閑,可執行合并。前項偏移為%d\n"), prevOffset);
            #endif
            }

            // b) 后項檢測:
            // 如果后項為Free,將當前項size=size+后項size,刪除后項。
            else if(prevFreeChunk.status != Free && nextFreeChunk.status == Free)
            {
            int nextOffset = static_cast(nextFreeChunk.pHead) - static_cast(heap_list[heapIndex].pHead);
            free_chunk_list_remove(heap_list[heapIndex].full_list[nextOffset].size, heap_list[heapIndex].hHeap);
            heap_list[heapIndex].full_list[offset].size += heap_list[heapIndex].full_list[nextOffset].size;
            free_chunk_list_add(heap_list[heapIndex].full_list[offset].size, heap_list[heapIndex].hHeap);
            int eraseSucceed = heap_list[heapIndex].full_list.erase(nextOffset);
            #ifdef _DEBUG
            // 如果移除偏移不等于1個
            if( eraseSucceed != 1)
            {
            _TRACE(_W("從完全列表中移除對象出現異常,移除nextOffset為%d,移除個數為%d.\n"), nextOffset, eraseSucceed);
            }
            _TRACE(_W("執行后項檢測且后項狀態為空閑,可執行合并。后項偏移為%d\n"), nextOffset);
            #endif
            return;
            }

            // c) 前后項檢測:
            else if(prevFreeChunk.status == Free && nextFreeChunk.status == Free)
            {
            int prevOffset = static_cast(prevFreeChunk.pHead) - static_cast(heap_list[heapIndex].pHead);
            int nextOffset = static_cast(nextFreeChunk.pHead) - static_cast(heap_list[heapIndex].pHead);
            free_chunk_list_remove(heap_list[heapIndex].full_list[nextOffset].size, heap_list[heapIndex].hHeap);
            free_chunk_list_remove(heap_list[heapIndex].full_list[prevOffset].size, heap_list[heapIndex].hHeap);
            heap_list[heapIndex].full_list[prevOffset].size
            = heap_list[heapIndex].full_list[prevOffset].size
            + heap_list[heapIndex].full_list[offset].size
            + heap_list[heapIndex].full_list[nextOffset].size;
            free_chunk_list_add(heap_list[heapIndex].full_list[prevOffset].size, heap_list[heapIndex].hHeap);
            int eraseSucceed = heap_list[heapIndex].full_list.erase(offset);
            eraseSucceed += heap_list[heapIndex].full_list.erase(nextOffset);
            #ifdef _DEBUG
            // 如果移除偏移不等于2個
            if( eraseSucceed != 2)
            {
            _TRACE(_W("從完全列表中移除對象出現異常,移除offset為%d,移除nextOffset為%d,移除個數為%d.\n"), offset, nextOffset, eraseSucceed);
            }
            _TRACE(_W("執行前后項檢測且前后項狀態為空閑,可執行合并。\n"));
            #endif
            return;
            }
            // d) 前后項檢測:
            else if(prevFreeChunk.status == Occupied && nextFreeChunk.status == Occupied)
            {
            free_chunk_list_add(heap_list[heapIndex].full_list[offset].size, heap_list[heapIndex].hHeap);
            }
            else
            {
            _TRACE(_W("該情況不在考慮范圍內。\n"));
            }
            }
            else
            {
            free_chunk_list_add(heap_list[heapIndex].full_list[offset].size, heap_list[heapIndex].hHeap);
            }
            }
            re: [C++]內存管理(1) volnet 2010-07-07 10:31
            @zuhd
            1、就像new和delete所面臨的挑戰一樣,我們能保證用的時候去分配,但是通常可能因為一些原因忘記去釋放這塊內存,比如你已經很小心了,但是異常出現的時候,可能delete并沒有執行。
            2、詳見上一條回復
            re: [C++]內存管理(1) volnet 2010-07-07 10:30
            @pcm
            我的意思是,在堆中,存放的是一個對象的真實內容,在棧中存在的是存放對象內容的堆的地址,也就是一個int *p,這樣,那么如果p的值在已經不在棧中了,也就是我這個管理器中還存有這個地址的相關內存的話,其實這塊內存將不再被引用,就被標記為垃圾了。
            re: [C++]內存管理(1) volnet 2010-07-07 08:58
            @OwnWaterloo
            希望您多指教啊
            re: [C++]內存管理(1) volnet 2010-07-06 23:34
            @OwnWaterloo
            嗯,樣式上,我自己有定義了幾個簡單的樣式。windows live writer+vspaste插件用來貼代碼。黃色部分的詳細設計,是我之前在Word寫好的,直接貼過來,可能樣式略有變化。
            造輪子好啊!造輪子才知道輪子有多么難造,你不造你永遠不知道!
            re: size_t的倒序遍歷問題 volnet 2010-07-01 23:58
            @OwnWaterloo
            好像不錯
            re: size_t的倒序遍歷問題 volnet 2010-07-01 14:10
            @Tiger
            可是我怎么看不到呢?您能截圖一下么,太奇怪了
            re: size_t的倒序遍歷問題 volnet 2010-07-01 09:16
            @egmkang
            我應該沒發到首頁去吧,你咋能看得到呢?
            re: [翻譯]高效使用auto_ptr volnet 2010-04-09 10:42
            @欲三更
            這就是應該象是:
            // stack <- dumb pointer
            // dump pointer -> do()
            // dump pointer -> hello();
            // stack -> delete dumb pointer auto

            該干嘛讓他自己干嘛去,我們要做的無非就是將指針在開始的時候交給棧可管理的對象去管理……然后繼續放任自由……
            re: [翻譯]高效使用auto_ptr volnet 2010-04-08 14:10
            @Benjamin
            這就是這篇文章的主題啊,除了之前提到過的幾種形式,就不應該發明其它形式了……
            re: 對 C++ 歷史的個人觀點 volnet 2010-04-07 19:17
            標記一下,郁悶啊,昨天在你CSDN看的,一點注釋都沒有,這里原來版本有改進……還有很多回復,晚上回去洗把臉再看
            @OwnWaterloo
            似乎沒有
            很久很久以前VC的默認配置是
            變量聲明一定要統統放在變量定義之上
            int sum = 0,value;
            while(std::cin>>value) //以前很少在while里面使用這樣的輸入
            sum += value;
            std::cout << sum << endl;

            //
            90
            80
            80
            6556
            =
            6806
            re: 如何編譯TrueCrypt源碼 volnet 2010-03-12 16:19
            @gengjl
            這樣做沒錯
            re: 如何編譯TrueCrypt源碼 volnet 2010-03-12 16:19
            @azunite
            這個是一個GUID,這個ID需要我們自行定義
            re: QuickSort快速排序法 volnet 2009-10-28 00:55
            @bug
            @bug
            兩位bug同學不知道是不是同一個人,在此特別感謝兩位提出的意見和建議。
            代碼已經做了修改,詳見http://m.shnenglu.com/mymsdn/archive/2009/10/28/quicksort20091028.html
            @你好!
            已刪除!
            孤陋寡聞了,原來這種東西滿大街都是,呵呵:
            http://blog.sina.com.cn/s/blog_455b20c10100929m.html
            http://andylin02.javaeye.com/blog/437166
            關鍵字:字符串相似度,最大公共字符串,LCS算法等
            re: QuickSort快速排序法 volnet 2009-06-19 00:10
            @bug
            非常感謝發現了問題。
            能否詳細說一下哪里的問題
            你的測試數據是多少?我也測測
            re: static in C volnet 2009-05-28 04:29
            @A
            沒錯,記錄一下,嗯,這樣以后可以不用翻書也可以找到
            @volnet
            簡單地說,就是修改對應警告項目的屬性,并修改編譯器類型為Linux GCC即可。
            現在出現了一個問題,再Windows下我用Eclipse,Workspace設置再E:\MyCProject中,在Linux下,我同樣期待將Eclipse的Workspace設置到相同的路徑,于是有\media\Personal\MyCProject,其中Personal是E盤的名稱。
            這些都沒問題,但是在編譯的時候出現了問題:
            Description Resource Path Location Type
            Invalid project path: Include path not found (/media/Personal/MyCProject/cpp_cake_sort/D::/GNU/MinGW/include). cpp_cake_sort pathentry Path Entry Problem
            re: Install Linux Fedora 10 volnet 2009-05-10 14:30
            終于可以用上Mplayer了,也可以用上Rhythmbox播放器了,但是音質有點糟糕,原因待查。
            首先要感謝軟件倉庫計劃,因為簡單地使用./configure,make,make install在我的機器上總是會有若干地錯誤,這些錯誤涉及到了軟件的源碼,絕對不是吃干飯的。偶爾發現了上一條留言中所提到的方法。恩,軟件倉庫,rpm repository!這絕對是一項偉大而有意義的工程,它極大地方便了用戶的使用。要使用軟件倉庫,也就是說你要用yum來安裝它,你可能需要先將軟件倉庫指定成yum的源。
            rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm
            rpm -ivh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
            這兩句話就是干這個用的。
            當然在文檔中有一種同時使用兩者的另一種方式,上面的這種方式再文檔中是通過GUI進行安裝的,也就是你現在看到兩個鏈接,然后直接在FireFox中點擊安裝即可。而下面的方式是命令行方式的。意思是一樣。參考配置信息(http://rpmfusion.org/Configuration)中的“Command Line Setup using rpm”部分章節(很簡單,就幾行,找到你的軟件版本,比如Fedora 10的發行版)。

            下面看下Rhythmbox播放器為什么昨天不行,今天可以?
            首先它一直都可以打開,但是對于播放MP3無能為力,因為它通常會在你的Fedora10發行版中自帶。而MP3要求交版稅的,也就是免費的 Fedora10無法為您提供的軟件,但是RPMFusion的出現就是為了解決Fedora project無法免費為您提供的這些涉及版稅或者那些源碼型的軟件分發。
            原來你試圖打開一個MP3,則會出現一個MPEG-1 編碼的問題,但是出現的自動下載插件的對話框并沒有辦法正確找到這個編碼器,取而代之的是它會重定向到某個官方文檔告訴你,這個插件可能受法律保護,無法提供給你使用。因此你必須自己手動去搞這些。但是現在你安裝(設置)了軟件倉庫,你的系統將為你找到合適的編碼器,并通過yum進行下載。經過一陣的下載后,您的軟件就可以用了。很不錯。

            為什么我喜歡Rhythmbox呢?
            因為我一開始看到Rhythmbox的時候就覺得它很像Apple iTunes,管理音樂很好看。而MPlayer我剛剛也見到了,但是它更像一個90年代的播放器,恩,可能皮膚上我需要重設。先用Rhythmbox播吧,呵呵。不過音質確實問題很嚴重,我的揚聲器現在只有1塊錢喇叭的效果了。呵呵~


            如何下載安裝MPlayer呢?

            http://hi.baidu.com/ppks/blog/item/8641e8dc47a9b4a9cc116649.html

            Fedora不給大家提供帶有版權問題或是封源的軟件,這個給我們下載軟件帶來了許多麻煩,所以在這里提供RPM Fusion源,來補充我們Linux的“軟件庫”。

            直接復制到虛擬終端里就好了,必須需要root的權限哦。另外建議直接復制輸入,以免打錯字。

            rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm
            rpm -ivh http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm

            如果安裝這個源后還是不能正常使用yum,那很可能是由于key引起,解決辦法是在終端里輸入下面的代碼試試:

            Linux下的播放器很豐富,聽說最好的還是MPlayer,簡單的只要要安裝好幾個包,現在與大家一起學下一種在Fedora 10安裝MPlayer的簡便方法。

            安裝步驟如下:

            首先確保你的電腦一定要聯網 ,因為是在線安裝;

            其次打開終端,復制以下代碼,回車看看吧

            yum install mplayer

            yum install mplayer-gui

            re: Install Linux Fedora 10 volnet 2009-05-10 12:57
            About bz2 & gz files

            *.tar.bz2以及*.tar.gz,雖然Linux并不指定后綴名,但從Windows用戶的使用習慣以及人類可識別的角度考慮,這樣一種命名規則給人更好的理解。當然tar程序并不通過所謂的“后綴”來識別。
            現在我們只討論實際類型與所謂的“后綴”匹配的情況。
            gz是指在tar打包的時候指定了用gzip的方式進行壓縮,指令是z,也就是說tar -z ****file代表的是使用gzip方式進行壓縮。
            而bz2則使用了另外一種壓縮方式bzip2的方式進行壓縮,對應的指令為j。
            這一點我們可以通過在命令行輸入
            man tar | more
            進行查看。
            因此正如我們在Windows中一樣,*.zip與*.rar一樣具有不同的壓縮格式。
            re: Install Linux Fedora 10 volnet 2009-05-10 00:34
            映像密碼和用戶權限

            Linux 用戶管理的特點之一在于它沿襲了 UNIX 風格,使用 passwd 文件。登錄的用戶必須可以讀取 /etc/passwd 文件,以判斷他的用戶名是否存在。如果將用戶名和密碼存放在同一個文件中,潛在的攻擊者就可能獲得密碼;他們可以下載 /etc/passwd 文件,然后以暴力破解的方法獲得密碼。映像文件不必所有人都可讀,這樣攻擊者將不能獲得任何形式的密碼。

            這種方法還是不最好的,因為攻擊還是可以得到 一些 用戶信息。更好的方法是將用戶保存于一個單獨的地方,比如使用 LDAP。
            re: Install Linux Fedora 10 volnet 2009-05-09 23:35
            關于Webmin

            Webmin 是一個用 Perl 編寫的基于瀏覽器的管理應用程序。Webmin 是可擴展的,除了用于 Linux 之外,還可以用于其他類 Unix 操作系統。安裝完成后,可以在本地或者遠程瀏覽器通過一個特定的端口,通常是 10000,來進入 Webmin。它具有可以指向和點擊的界面,可以完成各種 Linux 管理任務,包括用戶管理、網絡防火墻和網絡設備的配置。

            Webmin 安裝和使用都是免費的,它是一個很好的管理 Linux 環境的工具,如果您以前用的是 Windows 的圖形化管理工具。Webmin 工具是基于控制臺的工具的前端,因此使用這兩種工具進行配置效果是一致的,它們都可以可靠地完成管理任務。

            更多內容:http://www.ibm.com/developerworks/cn/linux/l-roadmap/part3/index.html
            re: Install Linux Fedora 10 volnet 2009-05-09 12:50
            另外,有個不錯地資源推薦給大家:
            http://www.ibm.com/developerworks/cn/linux/newto/index.html
            新手多看看咯,恩,我現在要開始看了。然后把遇到的問題逐一解決掉
            re: C++ notes (1) volnet 2009-03-13 19:15
            @sinor51
            可以說“不應該”,不能一般是指編譯會出錯吧
            re: 關于http://wap.baidu.com招喚 volnet 2009-03-06 03:11
            哈,為什么百度不公布Hi群,要公布QQ群,郁悶~
            有什么搜索方面的從入門一直到精通(不是那種書名就這么暴露)的經典著作推薦一下,另外,國內有什么相關資源呢,……你知道我要說什么,不知道,百度一下,呵呵~(開個玩笑)
            re: QuickSort快速排序法 volnet 2009-03-06 03:08
            如果大家是要寫C語言版本呢,我看看:
            1、把class包裹的一大堆都去掉(里面的聲明可以拷貝出來)
            2、把template <typename T>都去掉,Algorithms::也去掉
            然后就是調用的地方了,大家自己寫一下調用就可以了
            @maosher
            怎么了?
            @Dancefire
            謝謝你對Boost做了詳細的介紹。
            那么,學習Boost庫需要有哪些準備工作?(假設從初學者開始)學習Boost庫又有哪些方法或者經典的做法呢?(比如什么書,或者什么文檔)
            @Dancefire
            boost在C++中的地位是什么呢?一個工業庫?一個泛型標準?一個開源范例?它對C++學習有什么好處呢?
            @Dancefire
            原來你們說的是include foo.cpp

            分開有一個好處就是可以成套地替換吧,雖然通常我們不這么做,但是卻從語法上支持了這么做。如果可以當然好了,不行的話肯定是沒辦法的。
            @空明流轉
            我說的可以是指在h中聲明,在cpp中定義,這顯然是可以的(也是標準的做法)
            模板函數和模板類的確都存在如本文所述的問題,并且用Dancefire的方法,或者使用全部寫在.h文件中的方式,都是可以的。
            @Dancefire
            的確,把foo.cpp移出項目外的話就可以順利編譯并執行了!
            但是在你的回答中,為什么會提到“當繼續編譯main.cpp的時候……”,這是為什么呢?為什么非模板類型就可以?
            re: C++ notes (4) volnet 2009-02-06 15:01
            @路人丁
            ----------------------------
            const char *cstr = st1.c_str();
            std::cout<<cstr<<std::endl;
            而不是
            std::cout << st1.c_str() << std::endl;

            ----------------------------
            這么寫當然不是為了輸出,只是為了說明c_str的功能,輸出何必這樣寫呢?

            re: C++ notes (3) volnet 2008-12-26 16:00
            @飄飄白云
            你說的在理,這句話是Lippman說的,話說他們都是大牛,現在看相信誰的了……
            這可能涉及到不同的標準庫實現方式,看來這個問題要么應該忽略掉,根據實際需求,可以加的就加,不可以加的就算了。
            希望有達人來解釋一下
            re: C++ notes (3) volnet 2008-12-26 00:03
            @夜弓
            其實不論是哪種類型,自己用習慣了就可以,另外一種,大致了解,以便不會在別人的代碼中暈菜即可……
            單行的確可以解決這個問題,恩,不過在變量一多的時候,我們可能更經常用多行,事實上,這個也是習慣問題。而且單行可以更好的地注釋變量,而多行則通常適用于同一注釋的多個變量聲明
            共2頁: 1 2 
            特殊功能
             
            亚洲AV日韩精品久久久久久久| 久久―日本道色综合久久| 久久福利片| 久久久国产打桩机| 久久亚洲私人国产精品| 欧美精品一本久久男人的天堂| 久久久久亚洲精品中文字幕| 97香蕉久久夜色精品国产 | 久久人人爽人人爽人人爽| 久久亚洲美女精品国产精品| 很黄很污的网站久久mimi色| 亚洲色婷婷综合久久| 91亚洲国产成人久久精品网址| 色综合久久夜色精品国产| 97久久国产亚洲精品超碰热| 婷婷久久综合九色综合绿巨人| 精品久久人妻av中文字幕| 精品久久久久成人码免费动漫 | 中文字幕久久精品| 97精品伊人久久久大香线蕉 | 国产999精品久久久久久| 777午夜精品久久av蜜臀| 国产午夜精品久久久久九九电影| 久久久久亚洲精品无码蜜桃| 欧美精品丝袜久久久中文字幕 | 久久久无码精品亚洲日韩京东传媒| 九九99精品久久久久久| 亚洲精品tv久久久久久久久| 日批日出水久久亚洲精品tv| 国产无套内射久久久国产| 人妻精品久久无码区| 久久久久久久波多野结衣高潮| 久久久亚洲精品蜜桃臀| 国产成人精品久久亚洲高清不卡 | 久久精品国产亚洲av麻豆色欲| 久久99精品国产麻豆宅宅| 伊人久久五月天| 思思久久精品在热线热| 2021最新久久久视精品爱| 久久人人爽人人爽人人片AV麻烦| 久久久久久久久久久|