色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

C++模板分離編譯困境:從編譯鏈接原理到工程解決方案

C++模板分離編譯困境:從編譯鏈接原理到工程解決方案 1. 項(xiàng)目概述從“黑盒”到“白盒”拆解C模板的編譯之謎剛接觸C模板那會(huì)兒我總覺(jué)得它像個(gè)“黑盒魔法”。你寫(xiě)個(gè)templatetypename T T max(T a, T b)編譯器就能變出int max(int, int)、double max(double, double)甚至是你自定義的MyClass max(MyClass, MyClass)。這功能強(qiáng)大得讓人著迷但隨之而來(lái)的一個(gè)經(jīng)典問(wèn)題也困擾了無(wú)數(shù)開(kāi)發(fā)者包括當(dāng)年的我為什么模板不能像普通函數(shù)那樣把聲明放在.h頭文件定義放在.cpp源文件實(shí)現(xiàn)所謂的“分離編譯”編譯器報(bào)出的那些“未定義的引用”或“無(wú)法解析的外部符號(hào)”錯(cuò)誤常常讓人一頭霧水。這個(gè)問(wèn)題遠(yuǎn)不止是記住“模板定義必須放在頭文件里”這條規(guī)則那么簡(jiǎn)單。它直指C編譯和鏈接機(jī)制的核心是理解這門(mén)語(yǔ)言底層運(yùn)作原理的絕佳切入點(diǎn)。今天我們就拋開(kāi)那些籠統(tǒng)的說(shuō)法深入編譯器與鏈接器的“腹地”從模板實(shí)例化的完整生命周期出發(fā)結(jié)合編譯鏈接原理徹底搞明白模板為何與分離編譯“格格不入”。無(wú)論你是正在被大型模板項(xiàng)目編譯問(wèn)題折磨的中級(jí)開(kāi)發(fā)者還是希望夯實(shí)C基礎(chǔ)、理解語(yǔ)言設(shè)計(jì)哲學(xué)的初學(xué)者這次“深潛”都能讓你獲得遠(yuǎn)超預(yù)期的收獲。我們會(huì)從模板的基本概念聊起逐步深入到實(shí)例化的時(shí)機(jī)與機(jī)制最后用編譯器和鏈接器的視角完整還原錯(cuò)誤發(fā)生的現(xiàn)場(chǎng)并給出真正工程可用的解決方案。2. 模板基礎(chǔ)與實(shí)例化機(jī)制再探在深入核心矛盾之前我們需要對(duì)模板和實(shí)例化建立一個(gè)清晰、準(zhǔn)確的共同認(rèn)知。很多理解上的偏差都源于對(duì)基礎(chǔ)概念把握得不夠牢固。2.1 模板一份藍(lán)圖而非成品首先必須明確模板本身不是函數(shù)或類它是一份編譯器用于生成函數(shù)或類的藍(lán)圖或配方。當(dāng)你寫(xiě)下templatetypename T class Vector { ... };時(shí)編譯器并不會(huì)為這個(gè)VectorT生成任何實(shí)際的機(jī)器代碼。它只是將這段模板定義存儲(chǔ)起來(lái)記住有這么一個(gè)“模具”存在。這個(gè)過(guò)程發(fā)生在編譯的早期階段。編譯器如GCC的cc1plus或Clang的clang前端對(duì)源代碼進(jìn)行詞法分析、語(yǔ)法分析當(dāng)遇到模板定義時(shí)它會(huì)進(jìn)行模板解析。解析器會(huì)檢查模板語(yǔ)法的正確性但不會(huì)進(jìn)行類型檢查因?yàn)轭愋蚑未知也不會(huì)生成任何與特定類型相關(guān)的中間代碼。模板定義中的代碼對(duì)于編譯器來(lái)說(shuō)更像是一段待處理的“元程序”。2.2 實(shí)例化藍(lán)圖變實(shí)體的關(guān)鍵時(shí)刻實(shí)例化就是拿著具體的類型參數(shù)如int,std::string去套用那份藍(lán)圖生成一份實(shí)實(shí)在在的、可被編譯成機(jī)器代碼的函數(shù)或類定義的過(guò)程。生成的這個(gè)實(shí)體稱為特化。實(shí)例化的觸發(fā)源于代碼中對(duì)模板的使用。例如// 模板定義 (通常放在頭文件) templatetypename T T add(T a, T b) { return a b; } // 使用點(diǎn)觸發(fā)實(shí)例化 int main() { int sum_i add(1, 2); // 觸發(fā) addint 的實(shí)例化 double sum_d add(1.0, 2.0); // 觸發(fā) adddouble 的實(shí)例化 }當(dāng)編譯器編譯到add(1, 2)時(shí)它進(jìn)行模板實(shí)參推導(dǎo)推導(dǎo)出T為int。此時(shí)編譯器需要生成addint函數(shù)的代碼。它必須能夠找到add模板的完整定義即函數(shù)體{ return a b; }才能用int替換所有的T進(jìn)行語(yǔ)法和語(yǔ)義檢查比如int類型是否支持操作并最終生成對(duì)應(yīng)的機(jī)器指令。關(guān)鍵理解實(shí)例化是一個(gè)“編譯期行為”它發(fā)生在編譯器處理單個(gè)翻譯單元通常是一個(gè).cpp文件及其所包含的所有頭文件的過(guò)程中。編譯器不會(huì)跨翻譯單元去“猜測(cè)”或“尋找”模板定義。2.3 實(shí)例化的兩種方式隱式與顯式隱式實(shí)例化是我們最常遇到的方式即編譯器在遇到模板使用時(shí)自動(dòng)觸發(fā)如上例所示。這是最方便但也最容易導(dǎo)致困惑的方式因?yàn)閷?shí)例化的時(shí)機(jī)和地點(diǎn)對(duì)開(kāi)發(fā)者是透明的。顯式實(shí)例化則給了開(kāi)發(fā)者控制權(quán)。你可以明確告訴編譯器“請(qǐng)?jiān)诖颂帪樘囟ǖ念愋蜕赡0鍖?shí)體?!?語(yǔ)法如下// 在某個(gè).cpp文件中 templatetypename T T add(T a, T b) { return a b; } // 顯式實(shí)例化聲明 extern template int addint(int, int); // 聲明在別處實(shí)例化了 // 顯式實(shí)例化定義 template double adddouble(double, double); // 定義請(qǐng)?jiān)诖颂帉?shí)例化extern template是一個(gè)聲明它向編譯器承諾“addint已經(jīng)在其他某個(gè)翻譯單元實(shí)例化好了鏈接時(shí)再找它你別在這里實(shí)例化?!?而template double adddouble...則是一個(gè)定義強(qiáng)制編譯器在當(dāng)前翻譯單元生成adddouble的代碼。顯式實(shí)例化是解決某些特定編譯問(wèn)題如減少編譯時(shí)間、控制符號(hào)可見(jiàn)性的重要手段也是我們后續(xù)探討解決方案時(shí)的關(guān)鍵工具。3. 編譯與鏈接原理精講要理解模板的困境必須切換到編譯器和鏈接器的視角。讓我們簡(jiǎn)要回顧一下C/C程序的構(gòu)建過(guò)程它主要分為編譯和鏈接兩大階段。3.1 編譯階段翻譯單元的獨(dú)立王國(guó)編譯器的基本工作單元是翻譯單元。一個(gè)翻譯單元通常由一個(gè).cpp源文件及其通過(guò)#include遞歸展開(kāi)的所有頭文件內(nèi)容構(gòu)成。編譯器對(duì)每個(gè)翻譯單元進(jìn)行獨(dú)立處理彼此之間毫不知情。在編譯階段編譯器主要完成以下工作預(yù)處理處理#include,#define,#ifdef等指令生成一個(gè)龐大的、純粹的文本文件。詞法與語(yǔ)法分析將源代碼文本轉(zhuǎn)換為抽象語(yǔ)法樹(shù)。語(yǔ)義分析進(jìn)行類型檢查、名字查找等。對(duì)于模板此時(shí)只進(jìn)行非依賴名稱的查找和檢查依賴名稱指依賴于模板參數(shù)的名稱它們的查找要推遲到實(shí)例化時(shí)。生成中間代碼/匯編代碼將高級(jí)語(yǔ)言轉(zhuǎn)換為目標(biāo)機(jī)器架構(gòu)的匯編指令。生成目標(biāo)文件將匯編代碼轉(zhuǎn)換為二進(jìn)制的目標(biāo)文件如Linux下的.o文件Windows下的.obj文件。目標(biāo)文件中包含代碼段.text編譯生成的機(jī)器指令。數(shù)據(jù)段.data, .bss已初始化/未初始化的全局/靜態(tài)變量。符號(hào)表記錄本文件定義和引用的符號(hào)函數(shù)名、變量名及其屬性如類型、大小、地址。符號(hào)表是理解后續(xù)問(wèn)題的核心。一個(gè)符號(hào)比如一個(gè)函數(shù)有兩種關(guān)鍵狀態(tài)強(qiáng)符號(hào)在本翻譯單元有定義的符號(hào)。例如你在.cpp里實(shí)現(xiàn)了一個(gè)普通函數(shù)void foo(){}foo就是一個(gè)強(qiáng)符號(hào)會(huì)被寫(xiě)入目標(biāo)文件的符號(hào)表并標(biāo)記為“已定義”。弱符號(hào)/未定義符號(hào)在本翻譯單元只聲明了但沒(méi)定義的符號(hào)。例如你聲明了extern int global_var;或者調(diào)用了其他文件定義的函數(shù)void bar();global_var和bar在符號(hào)表中就被標(biāo)記為“未定義”需要鏈接器去別的目標(biāo)文件里找。實(shí)操心得查看目標(biāo)文件符號(hào)你可以用nm -C your_object_file.o命令Linux/macOS或dumpbin /symbols your_object_file.obj命令Windows VS開(kāi)發(fā)人員命令提示符來(lái)查看目標(biāo)文件中的符號(hào)列表。注意觀察“U”未定義和“T”或“D”已定義在代碼/數(shù)據(jù)段等標(biāo)記。這對(duì)于調(diào)試鏈接錯(cuò)誤至關(guān)重要。3.2 鏈接階段符號(hào)的全球匹配游戲當(dāng)所有翻譯單元都編譯成目標(biāo)文件后鏈接器登場(chǎng)。它的核心任務(wù)就是進(jìn)行“符號(hào)解析”和“重定位”。符號(hào)解析鏈接器收集所有目標(biāo)文件的符號(hào)表形成一個(gè)全局視圖。它的任務(wù)是為每一個(gè)“未定義”的符號(hào)在所有“已定義”的符號(hào)中找到一個(gè)且僅一個(gè)匹配的強(qiáng)符號(hào)。如果找不到就是“未定義的引用”錯(cuò)誤如果找到多個(gè)同名的強(qiáng)符號(hào)非模板函數(shù)/全局變量就是“重復(fù)定義”錯(cuò)誤有例外如內(nèi)聯(lián)函數(shù)、類成員函數(shù)。重定位一旦所有符號(hào)都找到了定義鏈接器就知道了每個(gè)符號(hào)在最終可執(zhí)行文件或庫(kù)中的確切地址。它會(huì)修改所有目標(biāo)文件中那些引用外部符號(hào)的指令將這些引用指向正確的內(nèi)存地址然后將所有代碼和數(shù)據(jù)段合并生成最終的可執(zhí)行文件或動(dòng)態(tài)庫(kù)。這個(gè)“一個(gè)定義規(guī)則”是保證程序確定性的基石。鏈接器的工作是機(jī)械的、基于已生成二進(jìn)制文件的它不具備編譯能力更不可能去理解C模板語(yǔ)法。4. 模板分離編譯困境的根源剖析現(xiàn)在讓我們把模板實(shí)例化和編譯鏈接原理結(jié)合起來(lái)模擬一個(gè)經(jīng)典的分離編譯錯(cuò)誤場(chǎng)景。假設(shè)我們“錯(cuò)誤地”嘗試分離編譯模板// mymath.h (頭文件) templatetypename T T add(T a, T b); // 只有聲明 // mymath.cpp (源文件) #include mymath.h templatetypename T T add(T a, T b) { // 模板定義 return a b; } // main.cpp (主程序) #include mymath.h int main() { int sum add(1, 2); // 使用點(diǎn)需要 addint return 0; }讓我們一步步拆解編譯和鏈接過(guò)程步驟一編譯mymath.cpp編譯器處理這個(gè)翻譯單元。它看到了add模板的完整定義。但是在整個(gè)mymath.cpp文件中沒(méi)有任何一行代碼使用add模板沒(méi)有addint或adddouble這樣的表達(dá)式。因此編譯器沒(méi)有觸發(fā)任何實(shí)例化。它只是把模板定義作為“藍(lán)圖”存儲(chǔ)在自己的上下文里然后生成的目標(biāo)文件mymath.obj中不會(huì)包含addint或任何其他特化的函數(shù)二進(jìn)制代碼。add模板本身不是一個(gè)可鏈接的符號(hào)所以符號(hào)表中也沒(méi)有addint的強(qiáng)符號(hào)定義。步驟二編譯main.cpp編譯器處理這個(gè)翻譯單元。它#include mymath.h所以它只看到了templatetypename T T add(T a, T b);這個(gè)聲明。當(dāng)編譯到add(1, 2)時(shí)編譯器推導(dǎo)出需要addint。它開(kāi)始嘗試實(shí)例化。但是在當(dāng)前翻譯單元內(nèi)它找不到add模板的函數(shù)體定義聲明只告訴編譯器“有這么一個(gè)模板”但定義函數(shù)體才是生成代碼的配方。編譯器無(wú)法憑空生成addint的代碼。這時(shí)現(xiàn)代編譯器如GCC/Clang會(huì)怎么做它們會(huì)假設(shè)“也許這個(gè)模板的定義在別的翻譯單元里并且會(huì)在那里被實(shí)例化?!?于是編譯器在main.obj的符號(hào)表中為addint生成一個(gè)未定義的引用‘U’狀態(tài)然后繼續(xù)編譯把問(wèn)題留給鏈接器。步驟三鏈接鏈接器開(kāi)始工作。它拿到main.obj和mymath.obj。main.obj說(shuō)“我需要一個(gè)叫addint的函數(shù)但我這里沒(méi)有它的代碼未定義?!?鏈接器去mymath.obj里找。mymath.obj里有什么它只有add模板的藍(lán)圖信息這在目標(biāo)文件里通常不以可鏈接符號(hào)的形式存在但沒(méi)有addint這個(gè)具體函數(shù)的二進(jìn)制代碼。因?yàn)閙ymath.cpp在編譯時(shí)根本沒(méi)有實(shí)例化它。因此鏈接器在mymath.obj里也找不到addint的強(qiáng)符號(hào)定義。結(jié)果就是鏈接錯(cuò)誤undefined reference toaddint(int, int)。核心矛盾總結(jié)實(shí)例化的觸發(fā)依賴于使用編譯器只在看到模板被具體使用的代碼行時(shí)才會(huì)嘗試實(shí)例化。實(shí)例化需要完整的定義實(shí)例化過(guò)程必須訪問(wèn)模板的函數(shù)體或類體。編譯單元的獨(dú)立性編譯器處理單個(gè).cpp文件時(shí)看不到其他.cpp文件的內(nèi)容。鏈接器的局限性鏈接器只處理已編譯好的二進(jìn)制符號(hào)不具備編譯能力無(wú)法根據(jù)模板藍(lán)圖生成新的代碼。在分離編譯的場(chǎng)景下main.cpp需要addint的定義來(lái)實(shí)例化但定義在mymath.cpp里編譯器處理main.cpp時(shí)看不到。mymath.cpp擁有定義但因?yàn)闆](méi)有使用而不實(shí)例化。鏈接器面對(duì)的是兩個(gè)都沒(méi)有addint代碼的目標(biāo)文件失敗是必然的。5. 工程實(shí)踐中的解決方案與權(quán)衡理解了問(wèn)題根源解決方案就清晰了我們必須確保在編譯器處理某個(gè)翻譯單元時(shí)在模板被使用的代碼點(diǎn)編譯器能夠同時(shí)看到該模板的完整定義。以下是幾種常見(jiàn)的工程實(shí)踐模式。5.1 包含模式Inclusion Model最主流的選擇這就是我們最熟悉的“將模板定義放在頭文件里”。實(shí)際上不僅僅是定義而是將模板的聲明和定義都放在頭文件中。// mymath.hpp (注意常用.hpp后綴以示區(qū)分) #ifndef MYMATH_HPP #define MYMATH_HPP templatetypename T T add(T a, T b) { // 聲明和定義在一起 return a b; } // 類模板同理 templatetypename T class Container { public: void push(const T value); T pop(); private: T data[100]; int index 0; }; // 類模板的成員函數(shù)定義也必須放在頭文件里 templatetypename T void ContainerT::push(const T value) { data[index] value; } templatetypename T T ContainerT::pop() { return data[--index]; } #endif // MYMATH_HPP工作原理當(dāng)main.cpp包含mymath.hpp時(shí)在預(yù)處理階段頭文件的內(nèi)容被原封不動(dòng)地復(fù)制到main.cpp中。因此在編譯器編譯main.cpp這個(gè)翻譯單元時(shí)它既看到了add(1, 2)這個(gè)使用點(diǎn)也看到了緊鄰在前的add模板的完整定義。于是編譯器順利地在當(dāng)前單元內(nèi)實(shí)例化出addint的代碼并生成強(qiáng)符號(hào)。鏈接時(shí)自然就能找到定義。優(yōu)點(diǎn)簡(jiǎn)單直觀符合大多數(shù)開(kāi)發(fā)者的直覺(jué)。通用性強(qiáng)適用于所有類型的模板和所有使用場(chǎng)景。缺點(diǎn)編譯依賴增加任何使用了該模板的源文件一旦模板頭文件有改動(dòng)所有包含它的源文件都需要重新編譯。在大型項(xiàng)目中這可能導(dǎo)致漫長(zhǎng)的編譯時(shí)間。暴露實(shí)現(xiàn)細(xì)節(jié)模板的內(nèi)部實(shí)現(xiàn)完全暴露給了用戶不符合信息隱藏的原則。可能造成代碼膨脹同一個(gè)模板在不同翻譯單元被實(shí)例化相同類型時(shí)理論上每個(gè)單元都會(huì)生成一份代碼雖然鏈接器最終會(huì)去重通過(guò)“COMDAT”節(jié)但仍會(huì)增加編譯器前端的處理負(fù)擔(dān)。5.2 顯式實(shí)例化模式權(quán)衡下的控制當(dāng)模板可能使用的類型集合有限且已知時(shí)例如一個(gè)數(shù)學(xué)庫(kù)只支持int,float,double可以使用顯式實(shí)例化。這需要分離定義并集中實(shí)例化。// mymath.h (頭文件只放聲明) templatetypename T T add(T a, T b); // 聲明 // mymath.cpp (源文件放定義和顯式實(shí)例化) templatetypename T T add(T a, T b) { // 定義 return a b; } // 顯式實(shí)例化定義告訴編譯器請(qǐng)?jiān)诖颂幧梢韵绿鼗拇a template int addint(int, int); template double adddouble(double, double); // 注意這里只實(shí)例化了int和double版本。如果其他地方用了addfloat鏈接會(huì)失敗。 // main.cpp (主程序) #include mymath.h int main() { int sum_i add(1, 2); // 鏈接時(shí)找到 mymath.obj 中的 addint double sum_d add(1.0, 2.0); // 鏈接時(shí)找到 mymath.obj 中的 adddouble // float sum_f add(1.0f, 2.0f); // 錯(cuò)誤mymath.cpp中沒(méi)有顯式實(shí)例化addfloat return 0; }工作原理mymath.cpp包含了模板定義并通過(guò)template int addint...顯式命令編譯器生成addint和adddouble的二進(jìn)制代碼。這些代碼會(huì)成為mymath.obj中的強(qiáng)符號(hào)。main.cpp只包含聲明使用模板時(shí)編譯器不再嘗試實(shí)例化因?yàn)樗豢吹铰暶鞫窃诜?hào)表中留下未定義的引用。鏈接時(shí)鏈接器在mymath.obj中找到了這些強(qiáng)符號(hào)成功解析。優(yōu)點(diǎn)真正實(shí)現(xiàn)接口與實(shí)現(xiàn)分離隱藏了模板的實(shí)現(xiàn)細(xì)節(jié)。減少編譯依賴修改mymath.cpp的實(shí)現(xiàn)只需重新編譯mymath.cpp本身??刂拼a生成避免生成不必要的特化版本減小二進(jìn)制體積。缺點(diǎn)靈活性喪失用戶只能使用預(yù)先實(shí)例化好的那幾個(gè)類型。如果需要新的類型必須修改庫(kù)代碼添加新的顯式實(shí)例化行并重新編譯庫(kù)。這對(duì)于通用庫(kù)來(lái)說(shuō)是致命的。維護(hù)負(fù)擔(dān)需要手動(dòng)管理實(shí)例化列表容易遺漏。注意事項(xiàng)使用“extern template”聲明為了優(yōu)化編譯時(shí)間即使在包含模式下也可以在頭文件中使用extern template來(lái)阻止某些廣泛使用的特化在多個(gè)翻譯單元中重復(fù)實(shí)例化。// mymath.hpp templatetypename T T add(T a, T b) { ... } // 告訴所有包含此頭文件的編譯單元“addint和adddouble已經(jīng)在某個(gè)專門(mén)的.cpp里實(shí)例化了你們別自己實(shí)例化?!?extern template int addint(int, int); extern template double adddouble(double, double); // 在某個(gè)專門(mén)的 instantiate.cpp 中 #include mymath.hpp template int addint(int, int); // 強(qiáng)制實(shí)例化 template double adddouble(double, double);這樣其他.cpp文件用到addint時(shí)編譯器看到extern聲明就不會(huì)生成代碼而是留下一個(gè)未定義引用最終鏈接到instantiate.obj中的那份唯一代碼。這結(jié)合了兩種模式的優(yōu)點(diǎn)。5.3 C20 Modules未來(lái)的終極解決方案C20引入了模塊Modules旨在從根本上解決頭文件包含機(jī)制帶來(lái)的諸多問(wèn)題其中就包括模板分離編譯。// mymath.ixx (MSVC) 或 mymath.cppm (Clang/GCC草案) export module MyMath; // 聲明一個(gè)模塊 export templatetypename T // export 表示這個(gè)模板接口對(duì)導(dǎo)入者可見(jiàn) T add(T a, T b) { return a b; }// main.cpp import MyMath; // 導(dǎo)入模塊而非包含頭文件 int main() { add(1, 2); // 使用模板 }工作原理模塊被編譯一次生成一個(gè)二進(jìn)制接口文件如.ifc。這個(gè)文件不僅包含聲明還包含編譯器進(jìn)行實(shí)例化所需的全部必要信息一種“序列化的編譯器內(nèi)部表示”。當(dāng)main.cpp導(dǎo)入模塊時(shí)編譯器讀取這個(gè)接口文件。在需要實(shí)例化addint時(shí)編譯器擁有足夠的信息從模塊接口中來(lái)生成代碼而無(wú)需訪問(wèn)原始的模板定義源代碼。這既實(shí)現(xiàn)了邏輯上的分離用戶看不到實(shí)現(xiàn)又保證了編譯期的實(shí)例化能力。優(yōu)點(diǎn)真正的邏輯分離接口干凈。編譯速度革命性提升頭文件重復(fù)解析成為歷史。完美解決模板分離編譯問(wèn)題。缺點(diǎn)編譯器支持仍在完善中不同編譯器MSVC, Clang, GCC的實(shí)現(xiàn)進(jìn)度和細(xì)節(jié)有差異。構(gòu)建系統(tǒng)需要升級(jí)如CMake舊項(xiàng)目遷移有成本。生態(tài)適配需要時(shí)間。6. 常見(jiàn)問(wèn)題與深度排查指南在實(shí)際項(xiàng)目中模板相關(guān)的編譯鏈接錯(cuò)誤千奇百怪。下面是一些典型場(chǎng)景及其背后的原因和解決方案。6.1 錯(cuò)誤“undefined reference” 但模板定義明明在頭文件里場(chǎng)景你確信模板定義在頭文件里并且被正確包含了但鏈接器仍然報(bào)錯(cuò)??赡茉蚣芭挪槎x與聲明不匹配檢查函數(shù)簽名包括模板參數(shù)、函數(shù)參數(shù)、const限定符、引用類型、noexcept說(shuō)明符是否在聲明和定義處完全一致。一個(gè)templatetypename T void foo(T)和templatetypename U void foo(U)會(huì)被編譯器視為兩個(gè)不同的模板。特化問(wèn)題如果你為特定類型提供了全特化template void fooint(int)確保全特化的定義對(duì)使用它的編譯單元可見(jiàn)。全特化是一個(gè)普通的函數(shù)/類它遵循ODR一個(gè)定義規(guī)則通常需要放在頭文件里除非使用顯式實(shí)例化模式。私有成員訪問(wèn)如果模板定義中訪問(wèn)了類的私有成員而該模板在類外部定義如類外定義的成員函數(shù)模板或友元模板需要仔細(xì)檢查友元聲明和訪問(wèn)權(quán)限。編譯器擴(kuò)展或Bug極少情況下可能是編譯器問(wèn)題。嘗試簡(jiǎn)化代碼到一個(gè)最小復(fù)現(xiàn)樣例并檢查不同編譯器版本的表現(xiàn)。6.2 錯(cuò)誤在多個(gè)翻譯單元中重復(fù)定義場(chǎng)景使用包含模式鏈接時(shí)報(bào)告“multiple definition ofxxxint”??赡茉蜻@通常不是模板本身的問(wèn)題。模板函數(shù)在多個(gè)單元實(shí)例化相同類型生成的符號(hào)通常是“弱符號(hào)”或“COMDAT”節(jié)鏈接器會(huì)正確去重。這個(gè)錯(cuò)誤更可能出現(xiàn)在你在頭文件里定義了一個(gè)非模板的普通函數(shù)或全局變量沒(méi)有static或inline修飾。這違反了ODR。你為模板提供了全特化并將這個(gè)全特化的定義放在了頭文件里但它沒(méi)有被聲明為inline。C17之前全特化函數(shù)在頭文件中需要加inline關(guān)鍵字以避免多重定義錯(cuò)誤。C17起在頭文件中全特化的函數(shù)模板、變量模板、成員函數(shù)模板等默認(rèn)是inline的。解決方案對(duì)于非模板的全局函數(shù)/變量如果需要放在頭文件使用static文件作用域或inlineC17起推薦。對(duì)于C17前的全特化在頭文件中加上inline關(guān)鍵字。6.3 編譯時(shí)間爆炸如何緩解包含模式最大的痛點(diǎn)是編譯時(shí)間。除了期待模塊Modules普及現(xiàn)階段可以采取以下策略前置聲明與惰性實(shí)例化在類模板中將成員函數(shù)的定義尤其是那些不常用的、復(fù)雜的函數(shù)放在類定義之外但仍在頭文件內(nèi)。這樣只有用到這些成員函數(shù)時(shí)編譯器才會(huì)實(shí)例化它們。使用顯式實(shí)例化進(jìn)行預(yù)編譯對(duì)于穩(wěn)定的、類型集合固定的基礎(chǔ)模板庫(kù)如某個(gè)項(xiàng)目?jī)?nèi)部的數(shù)學(xué)工具庫(kù)采用顯式實(shí)例化模式將其編譯成靜態(tài)庫(kù).a/.lib。其他項(xiàng)目只需鏈接庫(kù)和包含聲明頭文件無(wú)需在每次編譯時(shí)處理模板定義。利用“extern template”進(jìn)行編譯防火墻如前所述在公共頭文件中用extern template聲明常用特化在一個(gè)單獨(dú)的源文件中集中實(shí)例化它們。這能有效阻止模板代碼在數(shù)十個(gè)甚至上百個(gè)源文件中重復(fù)編譯。使用預(yù)編譯頭PCH將包含大量模板代碼的穩(wěn)定頭文件如標(biāo)準(zhǔn)庫(kù)頭文件、第三方庫(kù)頭文件放入預(yù)編譯頭。編譯器只需解析和編譯它們一次后續(xù)編譯直接加載結(jié)果能極大提升編譯速度。這是大型項(xiàng)目如游戲引擎的標(biāo)配。依賴管理工具使用如ccache或sccache等編譯緩存工具當(dāng)源文件未改變時(shí)直接使用之前的編譯結(jié)果。6.4 模板與動(dòng)態(tài)庫(kù)DLL/SO的交互將模板代碼放入動(dòng)態(tài)庫(kù)是一個(gè)更復(fù)雜的話題。核心矛盾在于動(dòng)態(tài)庫(kù)在編譯時(shí)就需要確定導(dǎo)出哪些符號(hào)而模板的實(shí)例化是延遲的、依賴于使用者的?;静呗燥@式實(shí)例化并導(dǎo)出在動(dòng)態(tài)庫(kù)項(xiàng)目中使用顯式實(shí)例化模式并標(biāo)記需要導(dǎo)出的特化符號(hào)如Windows的__declspec(dllexport)GCC/Clang的默認(rèn)可見(jiàn)性控制或__attribute__((visibility(default)))。庫(kù)的使用者只能使用這些導(dǎo)出的特化。// 在dll項(xiàng)目中 templatetypename T T add(T a, T b) { ... } template __declspec(dllexport) int addint(int, int); // 導(dǎo)出提供C風(fēng)格接口封裝這是更通用、更穩(wěn)定的做法。在動(dòng)態(tài)庫(kù)內(nèi)部使用模板但對(duì)外暴露一組非模板的、使用具體類型的C風(fēng)格函數(shù)接口。// mylib.h (C接口) #ifdef MYLIB_EXPORTS #define MYLIB_API __declspec(dllexport) #else #define MYLIB_API __declspec(dllimport) #endif extern C { MYLIB_API int add_int(int a, int b); MYLIB_API double add_double(double a, double b); } // mylib.cpp templatetypename T T add(T a, T b) { ... } // 內(nèi)部實(shí)現(xiàn) extern C int add_int(int a, int b) { return add(a, b); } extern C double add_double(double a, double b) { return add(a, b); }這種方式完全避免了模板的跨二進(jìn)制邊界問(wèn)題兼容性最好。理解模板無(wú)法分離編譯的根源不僅是為了解決一個(gè)編譯錯(cuò)誤更是為了深入理解C的編譯模型和語(yǔ)言設(shè)計(jì)哲學(xué)。它迫使我們?nèi)ニ伎冀涌谂c實(shí)現(xiàn)的邊界、編譯期與運(yùn)行期的分工、以及如何組織大型項(xiàng)目的代碼結(jié)構(gòu)。從包含模式到顯式實(shí)例化再到未來(lái)的模塊每一種方案都是在不同約束靈活性、編譯速度、封裝性下的權(quán)衡。掌握這些知識(shí)能讓你在遇到相關(guān)問(wèn)題時(shí)不再盲目嘗試而是能夠精準(zhǔn)分析選擇最適合當(dāng)前項(xiàng)目的策略。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲精品久久久久毛片A片拉屎 | 人妻精品视频一区二区三区| 97超级欧美| 日本成人A片网站| 日1区2区3区2020| 开心五月深爱五月| 蜜臀精品1区2区| 97国产高清视频在线观看| 亚洲素人综合| 日本污ww视频网站| 很黄很色的视频在线观看| 五月天精品| 艾草av| heyZO天然素人无码AⅤ专区| 国产亚洲精品无码三区| 青草地一本线一区二区三区| 欧美 亚洲 综合 制服 另类| 亚洲激情网一二三四区| 久久精品国产亚洲AV嘿嘿| 亚洲自拍97| 亚洲第一男人天堂| 久久精品老司| 亚洲中文字幕乱码无码一区二区| 国产AV高清AV无码| 9/A片| 亚洲精品三| 午夜福利精品| 在线观看色视频| 9Ⅰ超碰| 精品免费一区二区三区在线亚洲人成| 国产av白丝| 六月丁丁香| 国产福利精品最新在线| 2024人人操人人摸| 久悠悠av| 最新一二三区视频| 日本天天吊| 超碰国产在线| 超碰三级秋霞| 久久久免费一级黄片| 欧州一区二区三区四区| 亚洲性网| 18禁无码永久免费无限制| Sekablack无码一区| 男人久久天堂| 久久内射| 亚州熟女乱伦| 中国探花熟女| 亚洲色图大香| 欧美一区91大爱| 射丝袜高跟鞋99| 亚洲骚女一区二区三区| 国产夜夜艹| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 夜夜 中文视频rt| 91人人看| 欧美综合 站| 91色射| 伊人午夜福利视频| AV男人天堂网| 后入人妻无码| 激情综合网激情综合| 性综合网| 亚洲激情综合另类男同| 333kkkk·亚洲com久久| 九九热精品| 日韩情色视频| 天天α片| 99热这里只有精品18| 亚洲色图亚洲| 亚洲国产精品有声| 99丝袜福利在线播放| 五月色综合| 丝袜视频一区二区在线播放国产中文| 91久热| 亚洲人妻精品一区二区| 天天看天天日| 熟女字幕| 日韩9999| 婷婷九月国产| 大逼色网站| 欧美 亚洲精品首页| 人人妻人人爽一区二区三区| 黄页网站免费高清在线观看| 日本色色色| 国产欧美第五页| 夜夜福利| 欧州91高潮| 天天做天天爱夜夜爽毛片试看| 亚洲第一无码播放立川理惠| 91精品丝袜久久久久久无码人妻| 国产欧美日产一区二区三区 - 国产欧美日| 热久久无毒不卡| 精品久久97| 玖玖综合网| 国产极品99热在线播放69| 六月色色| 亚洲伊人久久精品影院| 超碰免费欧美7| 在线观看免费视频国产| 亚欧精品久久久久久久久久久| 麻豆性爱视频在线播放| 能看的av| 老鸭窝日丰县女人| 国产强奸乱伦xd| 欧美日韩m| 天天性射网| 99精品欧美一区二区三区桃色| av片在线观看免费播放| 亚拍在线| 日韩极品无码B| 丁香五月色情| 91美女片在线| 国产野战露脸在线播放| 欧美 日韩 另类 亚洲| 黑人干亚洲| 日韩中文字幕视频| 99中出在线| 欧美成97爱| 久久久久婷婷| 白嫩91在线亚洲| 国内毛片婷婷六月色| 国模限制级电影| 色综合天天爱去电影网| 五月丁香综合| 91熟女丨91老女人| 午夜天堂精品久久久久91| 熟妇高潮精品一区二区三区下载| 亚洲好看强奸乱伦| 国产乱码久久| 多毛小伙内射老太婆| 大香蕉国产中文自拍| 亚洲色图综合| 精品一区二区三区蜜桃臀赵总| 国产超碰97| 色欲日韩欧美在线一区| 丰满熟妇大乳做爰| 精品久久久久,69国产成人精| 日韩人妻丝袜中文字幕| 精品一区二区三区蜜桃臀赵总| 快灬快灬 一下爽蜜桃在线观看| 2018色综合天天操| 国产精品com| 99热99re超碰精品| 97香蕉网| 欧美一二三区四五区| 色综合av综合久久| 日本国产二线女色| 伊人五月天| 麻豆精品.欧美精品.日韩精品.| 操久久久久久| 亚洲精品尤物yw在线影院| 成人精品视频一区二区| 欧美 日韩 亚洲 春色| 熟妇高潮一区二| 视频国产成人精品日本亚洲18| 国产有码一区| 人干人人人操人人摸| 九九精品网| 精品久久久久久亚洲| 91色色网站| 国产极品久久久| 2024人人操人人摸| 国产美女自拍AV| 欧美亚洲se91| 91人妻爽爽人人做人人澡| 在线观看一级α片刺激高潮视频| 蜜桃丰满熟妇av无码区不卡| 人妻啊啊人妻啊| 18禁止看精品中文字幕| 天天拍夜夜| 级品肉射| 久久秀这里有精品| av大香蕉| 97av在线视频| 金莲网址| 久久久久久网址| 麻豆传媒一区二区在线观看| 亚洲中文字幕日产无码久久| av资源在线播放天堂| 九九九九热| 色超碰综合| 久热这里| 乱伦日本色图AⅤ| 日韩无码一区二区三区| 天天激色| 狠狠97| 熟女自慰久久久| 丁香五月天激情| 国产一区二区三区白丝| 久热一区二区| 综合97| 欧美色图片欧美色图| 伊人97超碰| 亚洲中文字幕网| 涩涩这里只有精品视频| 午夜美女福利视频| 亚洲中文字幕一区二区| 国产25页| 国内操逼视频二区| 台欧久久精品视频| 久久久草成人网站久久久草成人久久久草久久久 | 在线黄页看毛片| 国产一区二区在线电影| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 欧美AB在线| 97jingpin| 精彩久久中文| 精品无码人妻一区二区免费蜜桃| 99爱久久视频频| 五月婷视频| 人成午夜免费大片| 久久激情亚洲精品无码?V| 欧美性爱免费短视频| 亚洲久久久| 国产综合久久久麻桃个| 91岛国动作片| 一级婬片120分钟试看| 久久久久久性爱免费视频| 60秒试看最爽10分钟网站| 久久久久精| 九九热精品在线| 五月天黄色av| 人妻精品综合中文字幕在线 | 高清孕妇孕交 交孕妇| 男人的天堂在线| 亚洲国产精品久久久男人的天堂| 婷婷情色五月天| 久久欧洲| 久久久久久中文| 久久视频,这里只有精品| 加勒比五月天| 欧美精品宗合| 人人摸.人人色| 国产美女口爆吞精视频| 亚洲日韩美女中文字幕乱| 人干人人人操人人摸| 无套内射人妻在线播放| 久99热| 嗯啊不要在线| 熟女欧美日韩综合婷婷| 9.1小视频| 亚洲精品蜜桃久久久| 国产精品伦理| 亚洲网站一区二区在线| 成人激情无码在线视频| 亚洲Av无码成人精品国产| 亚洲 欧美 手机在线观看| 亚洲AV无码国产成人| 日日日日日| 日日日啊啊啊| 国产伊人精品在线| 91性高朝久久久久久久久| 三级三级三级日本99| 五月天综合在线| 夜色AV无码手机在线影院| 六十路日本| 亚洲免费精品一区| 国产嫩草精品A88AV| 日本大香蕉综合网| se01国产在线视频| 伊人五月天| 很很很很操| 天天射日日干| 色婷网| 91色图片| 花花AV导航| 欧洲成人性爱视频| 1024久久高清视频| 五十路熟女在线不卡观看一区二区| 亚洲成成熟女人综合一区二区| 老司机午夜精品视频| 超碰成人最新最好看| 久久侵犯人妻爽爽爽| 91欧美性| 色网站导航大全| 全球成人中文在线| SUV一区二区在线看| 精品三级在线专区| 免费夜夜爱黄色视频毛片| 成人一区二区三区四区| A级在线视频| 亚洲不卡三级手机播放| 丁香六月婷婷综合| 日日夜夜模| 日B操| 熟女六十路| …中文字幕亚洲乱,97人妻无码费视…| 欧美v日韩v亚洲v最新在线| 簧片免费看视频| 诱惑人妻欧美一区在线播放| 欧美爱三级日韩久久| 狠狠五月天| 婷婷丁香人妻 | 狠狠五月天| 另类老少妇| 一起草日韩| 欧美白嫩女HD| 蜜乳Av成人片网站| 亚洲欧美另类少妇精品| av网站免费看| 97这里都是精品| 97爱综合| 精品v1区| 一区二区三区高清天码| 97精品97久久| 人人插人人搞人人操| 欧美传媒一区| 无套内射性感少妇视频| 国产吹潮女在线观看| 日本视频在线观看污污污| 神马影院午夜福利久久久| 欧美爱三级日韩久久| 青草香蕉网| 一本大道不卡一二三区| 欧美与日韩97| 偷窥自拍亚洲天堂网爆| 欧美AB在线| 日本一区二区三区欧美日韩中文字幕| 日本三级黄页| 超碰导航97| 久久人妻视频网| 国产一区在线播放| 九九夜精品九九在线| 亚洲免费成人在线高清无码视频| 无码91| 95自拍视频在线观看| 精品美女久久一二三| 91精品啪在线观看国产城中村| 呦女网站| 久久男人的天堂国产| 欧美v日韩v亚洲v最新在线| 少妇毛片久久| 成人美女av| 校园激情狠狠四射| 97久久精品亚洲中六字幕| 精品人妻免费观看| 国产成人精品午夜福利| 久操视频免费在线观看| 思思热影视| 日韩欧美中文字幕搭讪巨乳美人妻视频| 久久亚洲不卡| 国产精品麻豆视频网站| 99999精品| 亚州综合图片| 天天日B狠狠操| 黄骗免费网站| 欧美顶级黄色大片免费| 蜜桃臀一区二区aV| 99操视频| 亚洲另类天堂| 东京热不卡视频| 911粉嫩人妻| 久久9久| 亚洲吊色| 亚洲国产精品乱码在线观看| 欧美日韩 强奸乱伦| 日韩99999| 精品十三区| 九九久久综合| 十八岁啪啪视频免费看| 日本精品一区二区三| 26uuu国产日韩综合在线观看| 九九九九一级| 欧美亚洲第1页| 亚洲欧洲无码bt精品合集| 色欲久久99精品久久| 三级片大波波| 五月婷婷性爱| 国内自拍 日韩激情 99| 国产美女销魂在线观看不卡| 欧美亚洲91| 91亚洲欧美激情| 国产吹潮女在线观看| 德国一二三不卡| 99综合视频一体| h4610国产人妻| 极品销魂美女一区二区| 97视频免费| 一级免费精品| 中文字幕精品三级久久久| 日韩精品人妻中文字幕有码午| aaa一级黄片| 99re公开精品免费视频| 岛国视频免费在线观看| 91性高朝久久久久久久久| 婷婷激情四射| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 99久久99九九99九九九| 人人干人人操人人..com| 一二三区操逼国产91| 97鸡把在线视频| 大香蕉在线视频重口味毛片在线| 国产精品免费视频人成| 亚洲一区二区性爱电影| 国产一区二区三区影片| 欧美很很操视频| 色综合色欲色综合色综合色综合| 懂色AV蜜臀无码精品APP | 欧美日韩国产中文精品字幕自在自线| 秋霞久久亚洲精品成人| 很很热性爱视频| 欧美日韩国产色图在线| 五月天婷精品激情| 人人天天干干| 亚洲.欧美.丝袜.中文.综合| 在线观看一卡二卡| 无码免费一区二区三区啪啪| 夜夜嗨一区二区| 97AV爱| 95人妻爽爽人人做人人澡| 热久久这里只有精品| 欧美嫩性色| 免费的av网| 欧美精品偷拍| 欧美一级专区免费大片| 青青草视频导航官网| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚洲欧美在线观看2021| 大香蕉黄色一区| 俺去也婷婷| 三级片大波波| 丝袜综合| 久草看看看| 精品人妻中文字幕高清| 免费黄色片。| 日韩 欧美 另类 人妻| www.av在线观看| 97亚洲综合电影| 性性久久| 日本不卡一区| 啪一啪免费视频| 男人的天堂2019AV| 国产精品国产| 日本一级真人黄色性爱视频| 亚州免费啪啪视频| 欧美少妇大量自拍视频在线观看| 天天插天天操天天摸天天射天天看| 曰本道人妻久久久在线不卡色视频| 久久久555| 涩综合导航| 五月丁香影视| 欧洲精品一二三在线| 国产精品久久泡妞网站| 操逼网站网站| 亚洲日韩AV视色| 欧美人人天天网| 啊啊啊啊好爽好舒服一区二区易域| 2017天天拍大香蕉| 亚洲成人性爱在线观看| 青青草伊人久久| 国产精品一区二区三| 91老熟妇| 久久99网站| 性交一区二区在线播放| 极品综合| 在线观看综合精品亚洲| 超碰到97情色| 日韩欧美成人综合在线| 理论久久婷婷网 8| 久久婷婷一区| 国产亚洲禁久一区二区| 97超碰总站| 欧美自拍偷拍综合图片| 日本精品人妻少妇一区二区| 亚洲男人天堂AV| 欧亚在线视频| 人人爽人人精品乱人伦AV| 国产亚洲福利第一页丝袜| 狠狠综合| 国产97视频| 91啪啪视频| 精品少妇一区二区| 乱伦AVxx| 91亚洲欧美综合高清在线| 久久久久久69国产一区二区| 欧美中文字幕一区 | 九九碰九九爱97超碰| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 99rre在线精品99re8| 中文字幕亚韩| 夜夜免费视频| 激情接吻视频久久久久久| 亚洲熟女乱色一区二区三区久久久| 国产肏逼网站| 婷婷丁香一区二区三区| 91一区二区三区蜜桃| 台湾佬激情综合| 国产v亚洲v日韩v欧美v片另类| 爱爱动态120秒| 天久久久噜噜噜久久国产精品爽爽 | 加勒比无码一区二区三区| 精品美女少妇一区二区| 五月天丁香| 国产60页| 啪啪视频mP4| 少妇久久| 岛国不卡超碰护士AV在线播放| 综合操逼| 国产精品久久久啊| 欧洲精品在线播放| 二男一女成人A片| www.acm成人黄色毛片| 性做久久久久久免费观看软件| 91欧美少妇| 国产丝袜视频| 国产多人在线观看视频| Aa东京男人的天堂| 亚洲综合激情五月久久| 国产狂喷潮在线精品| 狠狠图片青青草| 在线可观看的黄色网址| 欧色网址| 亚洲精品欧洲精品| 亚洲人妻av| 日韩av性爱在线播放| 不卡一区视频| 成人美女av| 亚洲熟女人妻中文字幕一区二区| 激情深爱五月天| 美国日韩黄片| 久久人妻无码毛片A片麻豆| 日韩午夜啪啪视频| 国产家庭乱伦表演| 日韩欧美久久婷婷网站| 2010男人的天堂| 在线观看岛国有码| 外站AV在线| 久久久国产精品亚洲精品| 大香蕉视频一二三区| 夜夜骑日日| 熟女中出视频| 九月色婷婷| 亚洲伊人a线观看视频| 怡红院亚洲怡春院av| 99精品丰满人妻无| 国产精品免费美女视频| 吖在线不卡一区二区国产剧情| 天天在线91| 男生女生啊啊啊啊| 性爱动态120秒| 国产精品成人福利在线| 亚洲欧美国产va在线播放频| 漂亮人妻被强中文字幕hd| 性色av一区二区| 日韩AV色图| 久久麻豆一区二区| 国产成人无码高清| 99久久精品国产系列| 男生女生啊啊啊啊| www.狠狠干.coom| 人人扣人人操| 极品色www影院| 久久91视频| 99久久无码| 巨爆乳肉感一区二区三区竹菊影视 | 99精品无码| 在线小视频| 久久AV色| 激情啪啪视频| 色眯眯av| 人妻素股| 少妇500双飞99| 九九九九九九九精品视频| 极品销魂美女一区二区| 在线观看中文字幕| 欧美色涩| 国产精品爱欲| 中文字幕一区二区在线日韩精品| 精品少妇人妻av久久免费| 久草尤物| 乱伦一区二区三区‘| 人妻啪| 色五天伊人| 91东京热男人的天堂| 岛国在线国产| 国产乱色国产精品免费视| 岛国1区2区3区在线观看| 国产无码精品无码| 无码人妻精品酒店| 男插女青青影院| 被男人吃奶很爽的毛片| 亚洲无线码欧洲精品区别| 国产乱伦亚洲| 26uuu国产免费观看| 99久久e免费热视| 欧美一二三级精品在线| 中文字幕国产| 欧美国产日韩高清在线| 亚洲天堂区| 欧美色图亚洲色图成人在在线| 成人女人国产| 麻豆a'v电影| 99综合自拍| 久久久内射良家| 国产9熟妇视频网站| 国产97在线 | 亚洲| 欧美v日韩v亚洲v最新在线| 国产精品精品系列在线观看| 操逼操逼逼操操逼91| 在线中文字幕| 大香网伊人久久综合| 操少妇很爽av| 亚州综合AⅤ| 热热色中文无码| 五月婷婷六月丁香网址| 97久久超碰| AA丁香综合激情| 91热情品| 老熟女综合网| 日本人妻中文字幕| 日欧操屄视频| 伊人国产视频| 大香蕉日韩| 午夜操逼不卡| 午夜婷婷| 9997se| A级片一区| 日韩性爱1级片视频| 婷婷综合激情| 九九自拍伦理| 天天澡天天爽日日AV| 激情看片网站| 亚洲国产丝袜在线观看| 中文字幕乱亚洲美女精品一区| 97chaopenrihan| 思思热在线cao| 旡码电影特区| 校园春色第一页| 中文字幕中文字幕一区二区| 日韩精品中文字幕二区| 欧美 亚洲 另类 综合| 快灬快灬 一下爽蜜桃在线观看| 人妻 丝袜美腿 中文字幕| 理论久久婷婷网 8| 狠久久| 日韩欧美国产一区二区三区四区| 久草综合京东| 麻豆亚洲AV成人无码久久精品| 不卡av免费在线网址| 亚洲人妻中文高清| 中文字幕97色| 精品国产三级av韩国在线| 欧美色五月| 久久免费9| 99精品久久久久久久婷婷蜜桃| 久久精品夜色国产亚洲AV| 婷婷午夜清品久久久久久久性色视频观| 久久婷婷综合国际产色怕| 久操操| 国产又色又粗又黄又爽| 色综合久| 国产精品久久久久婷婷二区次| 久久免费精品视频免一| 美国黄片aaa| 精品一区二区亚洲国产| 国产成人AV麻豆| 国产成人91一区二区三区| 六九九九| 97精品一区| 狠狠爱综合| 日日骚av| 欧美日韩成人| 亚洲色图欧美| 狼人综合婷婷激情四射 | 久久精品一区二区三区四区五区| 亚洲欧美精品一区天堂久久 | 91久久99久久91熟女精品| 亚洲久草AV色图| 99综合免费视频| 中国少妇啪啪视频| 五月婷婷综合网| 97日韩| 久久这里精品国产99丫e6| 国产精品不卡av免费在线观看| 国产乱婷婷精品二区三区| 欧美精品 - 91爱爱| 操逼大黄片| 日本三级韩国三级美三级91| 免費黃色視頻觀看一| 久久春色| 91欧美长吊| 日本 色 导航| 欧美性高潮| 久久综合18p| 五月婷婷丁香六月丁香| 欧美洲精品一级| 久久五月丁香| 亚洲在线91| 免费综合亚洲中文| 亚洲在线欧美| 操逼999| 天天躁日日躁AAAAXXXX国产| 超碰97资源网亚洲| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 欧美中文狠| 熟妇操花| 日韩成人私密一级精品av| 国产精品久久久久久久久久久久久久久 | 天天日日日射| 中国探花熟女| 国产一级舔足在线观看| 欧美综合传媒| 日本99热| 人妻99p| 外国免费性情大片| 久日91在线| 五月大香蕉| 在线无码网站| 天操天操夜操夜月月年年操操| 男人的天堂亚洲| 久久国产乱子伦精品免费女人| 97日韩欧美亚洲| 欧美日韩婷婷中文| 日韩草久视频| 婷婷中文网| 黄色成人网久久久久久| 日本精品加勒比海一区| 中文字幕十五区| 色欲日韩欧美在线一区| 日本性爱视频一级| 无套后入双马尾| 99在线啪| 亚洲 欧美都市激情| 手机在线观看不卡无码av| 91久久久亚洲| 久久久久久久| 夜夜操夜夜高潮夜夜爽国产精品区| 久久久久9久久久久| 五月天激情视频| 成人午夜小视频手机在线看| 蜜乳中文字幕a在线| 国产精品动态一区二区三区四四| 久久一二区四| 爱爱60秒免费视频| 操碰97| 亚洲无码 国产无码| 一本色道久久综合精品婷婷| 97色妞| 亚州日韩97| 成人久久精品| 96免费视频在线| 白 大 人妻 区 在线| 91neishe| 久久久啊啊| 色噜噜综合在线| 色哟哟国产精品免费网址| 99这里只有精品| 99色在线视频| 国产日韩精品suv| 97人人射| 玖玖视频在线资源一区二区三区| AA丁香综合激情| 综合色图区| 超碰79人人乐| av优播| 天天肏夜夜肏| 亚洲第一综合| A V少妇特黄三级| 亚洲AV无码天美传媒一区| 国产91美女高潮| 天天操女人| 色色丁香| 天天干天天日天天射黄色| 中文字幕国产精品1区| 亚州操操穴网| 久久久久亚洲精品| 欧美在线视频播放| 天天操天天7| 欧美日韩制服| 蜜臀中文字幕| 亚洲无码成人精品| 377p欧洲日本亚洲大胆| 精品v日韩欧美国产| 亚洲麻豆精品二区三区| 啊啊啊啊啊啊啊国| 啊啊啊啊啊啊啊啊啊啊在线观看| 蜜臀AV成人精品蜜臀AV久久| 后入式在线免费观看60秒| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 性色高清在线| 97色诱| 大香蕉92| 久久久蜜桃臀无码视频| 国产午夜福利专区综合| 免费看黄视频亚洲网站| 欧美三级中文字幕hd| 99亚洲精品| 亚洲男人的天堂V| 97免费视频在线观看视频| 日天天九九天堂666| 亚洲一区在线观看欧洲| 特级丰满少妇一级AAAA爱毛片| 超碰人人在线| 青青草视频这里只有精品| 欧美性,色九九| 青青操日韩| 国产家庭乱伦表演| 亚洲欧洲综合视频在线| 91红杏| 天天插天天操天天摸天天射天天看| 大香蕉手机在线| 中国AAAAAA黄色片| 秋霞曰韩R级| 欧美一区二区情色| 9999伦理视频| 国产欧美另类久久久精品课程| 久久婷婷电影网| 久久人人爽人人爽人人片Ⅴ| 玖玖婷婷五月天| 亚洲精品天天影视综合网 | 永久免费发布性爱网| 欧美精品四区| 国产三级中文字幕粉嫩| 欧美特大AA级黄片| 九九九九久久久| 嗯嗯啊啊的视频| 岛国黄片网站| 2020视频1区2区3区| 最新av在线| 欧美亚洲图片| 亚洲中文字母在线播放| 久久伊人网视频一区二区三区| 男人的天堂久久狠| 精品国产91内射久久| 久久精品人体AV| 欧美人妻另类在线| 欧美天天综合在线| 另类在线| 亚洲第二页| 久久三| 久9久9精品| 91综合色噜噜| 婷婷成人久久久精品| 91日产桃蜜| 日韩性爱小视频在线观看| 夜草欧美| 小日子操bb在线看| 日欧美色| 午夜亚洲WWW湿好大| ss久久| 99999精品| 天天干,夜夜爽| 天天操天天7| 思思热在线cao| 亚洲欧美日韩电影网站一区| 日本一区不卡| 爱爱动态试试看6 0秒| av情色影音| 五月天亚洲网| 欧美白嫩女HD| 狠狠操夜夜操蜜桃视频三区| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 日本潮催一卡操| 久艹伊人精品综合在线| 国产精品乱码久久久久久| 99久久99久久免费精品蜜臀| 91人妻尻屄视频| 超碰9 7女人| 色官网在线| 中文字幕无码不卡啪啪| 婷婷久久五月综合激情| 欧美大香蕉同搞| 一区二区三区四区在线不卡| 国产亚洲综合欧美一区| 极品出轨视频网站| 五月丁香| 日韩欧美亚洲自拍偷拍| 精品国产乱码久久久久久久久1 | 欧美日韩97| 一区久久久二区| 伊人久久综合影院精品久久久| 91天天综合网,天天综合网| 精品日韩人妻精品一二三区| 99精品视频在线观看| 91免费看一区二区三区 | 国产欧洲精品亚洲午夜拍精品| 偷拍自拍在线视频观看| 求求你操操我| 亚洲欧洲自拍图片专区满春格| 国产人妻一区二区三区欧美毛片| 18禁的网站在线| 超碰九九| 欧洲乱码一区二区| 九色精品视频导航1| 91 丝袜在线观看| 二色av| 夜夜高潮夜夜爽夜夜爱爱一区| 中文字幕一区av| 摸奶性爱视频网站在线免费播放| 成人十八禁日韩欧美一二三| 色播五月丁香| 无码免费在线观看黄色片| 亚洲综合大片| 丁香五月性| 成人一道本免费视频| 91精品人妻五十路| 天天综合网久久ww| 日本女优在线视频福利| 2020中文字幕在线观看| 国产精品在线网站| 91在线色综合| 久久成人国产| 婷婷色综合欧美日韩| 欧美天堂亚洲电影院一区在线播放| 再深点灬舒服灬太大了添视频| 99国产女人| 精品无吗久久| 婷婷色导航| 亚洲精品人妻在线| 97亚洲精品| 亚洲欧美setu| 99国内精品| 久久曰曰| 国产精品香蕉| 欧洲亚洲人妻无码中字久久三区四区| 久精品无码av一区二免费国产在线观看 | 久久久久骚| 国产女人成人精品视频| 欧美亚洲素人制服精品| 人人模人人看| 97K超碰在线| 公司1区2区3区精产精| 国产亚洲 中文欧美久久| 亚洲性爱无码乱伦av| 思思热在线视频免费| 欧美激情专区| 成人九九| 激情五月天校园春色网| 嫩草 人人网精品| 久久久久国产精品片区无码直播| 大香蕉日亚洲日本亚大 | 91久久久久久久久久久| av中文在线| 91在线无码精品秘 软件| 综合五月婷婷亚洲一区| 麻豆尤物视频网| 四虎影视永久在线观看精品免费网站 | 3028国产精品| 97超碰色色| 精品国产乱码久久久| 91日日夜夜| 二级毛片| 黑人综合色| 国产三级中文字幕粉嫩 | 男人的天堂色偷偷青青草视频婷婷网| 国产精品老熟女一区二区| 青青操轻轻| 久久精品国产免费观看99| 亚洲天堂7777| 精品性爱无码在线播放| 欧美视频边做饭边橾| 成年女人黄网站| 亚洲AV操| www.国产高潮精品| 国产 三级自拍| 大香蕉九九| 中文字幕亚韩| 色99色| 欧美精品人妻视频| 激情五月天视频| 国产午夜无码片在线观看影视| 日操粉逼逼| 五月丁香六月婷综合成人综合| 国产免费一区二区在线A片视频| 思思热影视| 色五月婷婷麻豆在| 在线观看AV不卡| 操久久久久久| 男人的天堂.com| 96免费视频在线| 亚州Av天美传媒| 91亚洲图片| 亚洲大胆人体av| 亚洲校园激情| 青青草国产欧美非洲黑人| 一级性爱视频免费观看| 天天看天天在线精品| 欧美精品久久久久久久久88| 亚洲天堂久久| 色综合色色| 宅男午夜在线视频| 欧洲精品久久| 超碰99在线| 亚洲成人在线高清| 久久肏大逼| 伊人综合色网| 午夜精品99久久久久传媒| 啊啊啊啊在线观看网址| 人人爽夜夜玩视频| 中出欧美| 亚洲欧美综合区自拍另类 | 99re免费视频精品全部| 人妻丰满熟妇一区二区三| 中文自拍欧美影视| 中文字幕大片三级狠狠干| 骚女高跟AV在线| 青草精品视频日本久久久久网站在线| 天天弄天天操| 深爱激情五月天| 日本啊啊啊啊啊视频| 91欧美性| 天天噜| 亚洲成a人在线观看久| 人人乐大香蕉| 中文子幕一二三| 91欧洲国产成人久久精品网站| 欧美日韩国产高清在线一二三区| 亚洲日韩成人性爱视频| 在线女人91| 欧美瑟综合| 日本一区视频在线观看| 人人爱人人操人人性| 精品十三区| 久久久久久久唑| 人人摸人人添人人操 | 亚洲成a人在线观看久| 激情av| 天天碰久久入| 日韩在线一区二区| 婷婷深爱五月| 粉嫩小泬久久久一区二区| 欧美色女人| 婷婷五月av| 99re8免费高清在线| A 天堂| 夜夜嗨一区二区| 青久久| 狠日操| 黄色十八禁网站| 欧美乱伦专区| 国产精品亚洲一级av第二区| 天天亚洲综合| 午夜舔阴达高潮视频免费看| 狠狠色丁香| 国语精品av| 午夜男人一级A片7777| 欧美国产操逼| 琪琪精品免费一区二区三区| 久久偷拍人| 亚洲欧洲日本精品中文a∨| 蜜桃视频精品一区二区| 欧美少妇高潮视频| 天天日B夜夜干B时时操B| 亚洲素人网| 99久久久无码精品国产人| 欧美国产有色电影| 在线观看不卡一区二区三区| 久久激情网| 国产又粗又长视频| 91高清无码下载| 国产久久久久影院老熟女| 精品中文字幕一区二区| 97香蕉人人乳| 人妻一二三区| 亚洲欧美中日韩| 亚洲一区二区三区春色| 99在线精品观看99| 97综合激情| 日韩AV电影网站| 亚洲精品久久久久久久蜜桃臀| 黄色欧美性爱视频| av天堂加勒比| 屌逼麻豆| 深夜激情 | 欧美九九九九九| 色官网色综合| 少妇高潮喷水无套久久久久久| 久久精品日韩| 青草伊人久久| 操逼片中文| 亚洲日韩美女丝袜美腿人妻视频| www.婷婷六月天| 啊啊啊啊操死我| 东北黄色电影| 亚洲一区二区三区播放在线| 亚洲精品 欧美精品| 亚洲无线观看久久| 精产国品一区二三产品| 日韩欧美tv一区二区在线观看| 久久9久久| 泰国AV在线观看| 看日韩操逼| 亚洲动态色图| 秋霞福利网| 色色操| 亚洲精美粉嫩嫩泬在线观看 | 久久久久921| 一区二区三区四区色图| 综合伊人网12色| 欧美后入式| 美女啊啊啊啊啊啊啊| 在线精品福利免费播放| 熟女91网站| 大香蕉琪琪日本女优不卡| 色婷视频| 先锋色眉乱伦资源| 欧美激情在线观看视频| 亚洲男人的天堂网| 99精品在线观看| 欧美日韩欧美| 久久超碰98| 亚洲少妇色| 无码国产精品96久久久久孕妇| 青青青操| 国产在线视视频有精品| 日本精品五区| 久久久久幕乱码| 97人人中文网| 91视频国品一二三区| 18禁精品网站在线看| 中出欧美| 蘋果手機免費看成人Av| 极品五月天噜噜| 操逼操操操91| 免费精品中文字幕| 另类天堂| 国际精品久久久| 伊人玖玖网| 欧美色图片91| 熟女人妻一区二区三区| 国产成人91一区二区三区| 91九久| 九月婷婷综合| 日韩Va亚洲va欧美Ⅴa久久| 国产成人亚洲精品无| 日本免费二区三区| 97干综合网| 日韩欧美丝袜诱惑| 九一综合精品视品av| 激情五月天色色网| 日韩性爱视频免费在线| 欧洲亚洲国产综合在线| a片 xxxx受爽视频| 亚洲欧美洲综合| 亚洲图片 欧美电影| 欧美大战久久久伊人| 超碰97最新人妻| 久9久| 欧美 亚洲 大香| 日韩性色b| 久久伊人在线五区| 亚码激情| 国模限制级电影| 久操操| 免费夜夜爱黄色视频毛片| 成人av动漫在线观看| 亚洲精品成人激情在线| 国产强上视频在线观看| 多乙久久久久久| 在线欧美69V免费观看视频| 精品毛片av一区二区| 国产丝袜欧美在线视频| 亚洲āv网址在线观看| 国产一级内射高清视频| 亚洲A曰本VA欧美VA视频| 亚洲色图A| 91东北熟女| 中文字幕在线免费观看 | 国产13区|