日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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
返回資訊列表
黑人性暴力毛片| 欧美色图成人网一区二区 | 国产精品久久久久久高清无码免费看 | 狠狠爱综合网| 一中国女人毛片水真多| 美女黄页网站| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 蜜臀亚洲综合一二三四区| 综合久久久久久久综合网| 久久国产对白激情浪潮| 青青草视频这里只有精品| 999亚洲国产视频| 熟女熟妇一区二区三区视频| 爱爱动态120秒| 日本操BAV| 96一区二区| 香蕉av一区二区三区| 精品少妇后入一区二区三区四区人妻巨乳| 一区二区三区黄色片a| 日韩久射综合| 91老妇女| 夜夜爽夜夜摸夜夜操免费视频| 国产av尤物| 欧美日韩日产免费网站看| 中文字幕激情小说| ...日韩成人一区二区三区字幕| 亚洲第一无码播放立川理惠| 一级特黄aaa大片在线观看成人一级片在线观看 | 激情终合网| 国产人妻精品久久久一区二区三区 | 欧洲Au麻豆| 综合五月婷婷| 成人av免费观看| 国产精品com| 人妻丝袜日本| 怡红院成人视频| 超碰在线第一页| 精品亚洲俞拍视频一区| 青春草A| 美女诱惑爱爱| 日本高清电影欧美色图| 久99| 亚洲人精| 欧美大香蕉在线观看| 久久人妻视频| 久久国产三区| 东京太热久久久| 水澄无码AV| 久久久九九网站| 91高清无码下载| 日韩激情毛片一级久久久| 一起草三级AV电影在线观看 | 立川理惠被中出无码| 97天天日| 亚洲色图尤物视频| 人人操人人插人www| 国产黄色剧情影片麻豆免费播放| 中文字幕丰满人妻日本| 亚洲精品自拍| 中文字幕一区二区韩| 特色a在线上| 91久| 性暴力欧美猛交在线直播| 欧美αv.com| 能在线播放的国产三级| 操逼不卡中文字幕| 午夜福利成人免费视频| 五月丁香色综合| 国产欧美日韩女同性恋ww喷水精品 | 乱码熟妇人妻久久久| 亚洲aw毛茸茸在线 | 亚洲无码一区成人免费午夜| 欧美 亚洲 第一页 | 成人免费看吃奶视频网站| 91丝袜在线观看| 亚洲无码视频免费在线观看网址!| www.色吧5.com| 日韩乱伦影音先锋| www久久久| 综合一区中亚洲国产成人综合精品| 91久久久久久久| 精品无吗久久| 超碰97在线色男人??| 日曰骚久久精品| 99999精品| 午夜视频好爽啊| 色丁香五月婷婷| 超碰久久中文| 男人的天堂色偷偷青青草视频婷婷网| 91路www| 精品国产乱码久久久A| 亚洲国产精品成人综合| 91人妻爽爽人人做人人澡| 国产高清1234区| 中文字幕精品专区搜索结果91| 天天综合网网欲色| 乱精品一区字幕二区| 九一综合精品视品av| 夜夜爽爽夜夜精品视频| 亚洲国产成人精品久久久国产成人一区二区 | 国产亚洲精品A在线观看下载| 思思热国产在线视频| 五月丁香六月激情| 国产后入清纯| 色综合天天| 欧美一区二区亚洲天堂| 超碰久久网| 欧美精品成人一区二区在线观看 | 亚洲熟妇综合久久久久久| 国产不良强奸视频免费看| 99操| 操屄日韩| 日本黄色天堂| 亚洲女毛多水多21P| 欧美一二在线| 国产黄色在线播放观看| 午夜福利区| 欧美人与动性人交a| 中文乱码99| 日本中文熟女视频| 91红杏| 国产最火爆久久国产网站网站| 色999偷自拍拍| 99re这里只有精品9| 久久人妻视频| 久久国产免费激情视频| 欧美日韩青操| 青娱乐久久艹| 中文区中文字幕免费看| 日韩啪啪啪啪啪| 青草精品视频日本久久久久网站在线| 淫妻综合网| 91社区伊人| 中文字幕日韩精品一区二区三区| 欧美国产欧美在线观看| 男人的天堂久久久| 在线人妻熟女一区二区三区四区五区| 青青青国产手线观看视频2| 老师充足的奶水小说| 人人看人人插| 久久97视频| 丁香五月天堂网| 搡老女人老91二区| 亚洲大胆人体av| 嫖老熟女A片一二三区| 91欧| 国产精品熟妇一区二区三| xxx0国产在线播放| 射综合网| 91精品少妇搡搡搡| 久久久久密| 国产在线综合网| 亚州综合色图| 射丝袜高跟鞋99| 国产AV无码AV| 偷拍 欧美 日韩| 日韩精品作爱导航| 大香樵伊人网| 九色在线熟女国产黑人| 东京热天堂网| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 东京成人一区| 青青草九九九九九| 久热这里| 91Chinese在线| 91c色| 久久久月天| 青青草自拍视频在线播放| 久久久久久久久久久免费精品| 是还免费视频1727我| 九九久久精品| 性色生活片久久毛片婬片免费放女人一级毛片| 四虎影视精品| 久久妇| 又黑又大又粗| 欧美性爱五月天| 一级人妻性爱视频| 国产黄色在线播放观看| 91精品人妻一区二区三区蜜臀| 香蕉久久精品| 啊啊啊用力在线观看| 日韩人妻播放| 人人看黄色视频| 色97欧美| 91亚洲欧美综合高清在线| 欧洲Au麻豆| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 日日做夜狠狠爱欧美黑人| 97人妻色| 五月天激情网图片| 性爱av在线免费观看| 欧美日韩操逼动图| 看黄片视频免费| 国产精品久久aV| 深夜视频| 超碰97中文| 日韩久射综合| 欧美性爱超碰97| 亚洲十八禁止| 伦理弟一页| 国产自产91区13区| 嗯~啊~快点 死我视频| 久久伊人五月天| 操逼操网| 久久久久久久久成人av解说| 啪一啪免费视频| 国产一级高跟丝袜| 色色福利| 99热在线播放| 97免费在线视频在线观看| 大胆91| 中文字幕第页| 色好看av| 久久AV无码AV| 日韩肏逼视频| 日韩无码精品综合久久| 999亚洲国产视频| 亚洲h片在线免费观看| 乱伦一二三区| 天天干天天狼在线视频| 91色综| 高清不卡一二三区视频......| 无码一区二区三区四区五区六区七区八区九区十区视频 | 97综合国产| 久久久蜜桃臀无码视频| 69视频入口| 国产成人自拍视频视频| 色婷婷狠狠| 久久99操天天日| 四虎AV无码| 在线视频一区二区传媒| 欧美第五页| 夜夜爽夜夜操| 曰韩操B| 国模精品一区二区三区苹果色戒 | 国产97视频| 午夜视频黄| JIZZJIZZ国产精品喷水| 成人婷婷丁香| 97超碰免费人人性爱| 国产欧洲精品亚洲午夜拍精品| 2020中文字幕在线| 蜜臀一区二区三区在线| 约操熟妇| 天综合网| 久久 久久国内精品亚洲| 欧美激情内射| 377p欧洲日本亚洲大胆| 国产999精品久久久久久| 97色欧州| 酒色综合网| 亚洲小电影免费涩涩成人在线高清| 操逼操逼逼操操逼91| 五月天综合在线| 日本男人插女人的逼黄色| 欧美精品欧美精品系列 | 亚洲精品视频在线| 成人精品水蜜桃久久久久久久| 青草精品视频日本久久久久网站在线| 欧美人人AAA| 天美一二三在线观看Av| 亚洲综合在线91| 国产最新小视频在线播放下载| 日本黄 R色 成 人网站| 久久久九九| 免费无码婬片AAAA片直播色戒| 日本中文字幕在线视频| 青青草白白色| 欧美gv在线观看| www.丁香五月| 欧美色图99| 激情抓乳插进去啪啪啪日韩| 91在线免费观看处女| 9精品久久久久| 思思性爱| 久久9精品网站| 欧美激情视频在线一区| 西西美女视频网| 国产 日韩 欧美一区| 另类专区在线观看| 在线小视频| 性影在线视频| 国产精品第二页| 亚欧高清| 亚洲丰满很很操| 黄色AAAAA欧美| 97天天做| 久久精品日韩| A一级色女| av最新免费中文字幕| 久久97资源 网| 搡老女人老91妇女老熟女| 日韩精品一二三四| 精品999一区二区| 一区二区娱乐网站| 欧亚 另类 久| 成人网址在线观看| 看黄片视频免费| 极品内射| 亚洲国产奇米影视久久| 先锋音影AV| 福利操逼| 老女人91| 婷婷五月天社区| 射久久| 日本天堂网| 欧美性爱日韩高清| 欧洲亚洲人人爽爽视频| 免费看日本操逼视频| 国产精品夜夜夜| 色色五月婷| 亚洲天天更新| 色欲人妻一区二区在线| 人干人人人操人人摸| 超碰97.com| 五月婷婷激情| 婷婷在线视频在线观看| 亚洲精品蜜桃久久久久久久| 婷婷91| 伊人影院日本| 大香蕉综合在线| 九九伊人网| 亚州熟女乱伦| 精品二区三四区五电影 | av操操不卡| 偷拍三区| 亚洲深夜福利| 亚洲欧洲无码一区夜| 九色婷婷| 日小BB小视频| 久久专区| 91天天综合在线观看| 伊人97超碰| 欧美αv.com| 久久宗合97| 丝袜内射| 久热91| 国产AAAAAABBBBB| 四季av一区二区凹凸精品小说| 97人人草| 操操逼操操逼操操逼逼| 97在线看| 精品二区三四区五电影 | 99re不伦| 99自拍视频在线| 色综合一本| 综合网少妇| 操b网站亚洲无码| 91碰碰碰| 亚洲导航深夜福利| 欧美v亚洲v综合v国产v妖精| 国产精品伦理| 日韩精品9区| 欧美 中文字幕 一区| 日韩不卡毛片Av免费高清| 无码人妻精品酒店| 91爱| 久久精品超碰| 男人天堂网手机版婷婷| oumeizonghese,www| 日韩三级视频一区二区三区| 欧美日韩91| 四虎影视永久在线免费| 色婷婷六月丁香七月婷婷| 超碰碰97资源站| 老司机午夜精品福利视频一区二区| www鬼畜国产男人的天堂| 国产福利精品最新在线| 韩国黄片aaaa| 黄骗免费| 激情网色| 人妻 丝袜美腿 中文字幕| 日韩成人性日韩成人性爱视频在线免费观看| 亚欧美色图| 久久久久密臀视频| 色麻豆AV| 9997se| 国产高清视频无码在线| 女人综合网| 麻豆天美91| 老女人综合网| 91亚洲色人| .精品人妻一区二区三| 日本性感人妻91| 色欲天天综合久久久无码网中文| 操一操摸一摸| 日韩欧洲操屄视频| 十八岁啪啪视频免费看| 国产麻豆福利av在线播放| 青青操综合网| 国产精品久久久久av| 五月色网| 九九九久千久久激情蜜桃在线看 | 久久久久久久9最新免费视频观看| 日韩午夜国产| 色悠久久久av| 97碰碰色| 99re热有精品视频国产| 思思热久久成人| 久久草在线综合视频| 五月婷婷激情网| 防屏蔽在线视频| 精品久久久久,69国产成人精| 情侣开房子拍 日韩无码 女的很漂亮| 精品一区二区三区最新| 99在线啪| 老司机福利青青草| 国产精品探花视频| 九九碰九九爱97超碰| 2010男人的天堂| 91亚洲影院综合| 国产久久久久影院老熟女| 欧美第五页| 一起草在线视频| 天天躁日日躁成人字幕aⅴ| 国产精品一区二区三区,亚洲综合| 日本人人操人人操| 麻豆人妻精品一区二区| 欧美性生活内射| 深夜激情| 思思热在线cao| 国产 日韩 欧美 人妻 熟女 中文| 美女露胸露奶头| 欧美激情久久久久| 9久精品| 欧美精品99久久久**| 秋霞一级视频在线观看免费| 亚洲s在线观看| 天天干1区2区在线| 在线午夜成人无码视频| 尤物一级在线免费观看| 国产不卡片| 91老熟女91老女人| 性暴力欧美猛交在线直播| 欧美日韩性爱视屏免费看了| 久久久久久久久久黄色网| 91成人亚洲色图| 99久久亚洲精品无码毛片潘甜甜| 亚洲色诱惑| 嗯嗯啊啊好疼| 国产粉嫩蜜臀av一区二区三区| A 天堂在线观看视频| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 美女啪欧美一区| 麻豆91熟妇人妻中文字幕茄子| 国产传媒操逼视频| 日日AV加勒比| 亚洲 无码 偷拍| 天天干美少妇一区| 中文字幕一区二区无码成人| 亚洲九月丁香| 夜夜夜夜爽| 曰韩操B| 男人的天堂欧美| 2019天天干| 麻豆人妻精品一区二区| 91制服丝袜| 秋霞曰韩R级| 色香伊人| 日韩欧美午夜视频在线| 劲爆欧美人妖三区91| 一二三四免费视频| K8久久久久| 黄aaaaaaaaaaaaaaaaaa色网站| 色天堂综合| 色色网91| 日韩精品人妻中文字有码在线| 国产精品盗摄 偷窥盗摄| 伊人97色天使| 免费观看网黄| 久久国模av| 精品欧美А∨无码黑人大荫蒂| 一级黄碟在线观看| 五十路三级片| 亚洲欧美内射| 天天流夜夜操| 午夜男女爽爽爽影院视频| 好吊色一区| 日韩黄片视频试看| 安微少妇操BBB| 在线观看日韩av不卡| 亚洲精品黄码久久久久| 懂色AV一区二区三区| 97亚洲精品| 日本伦理一区二区| 亚洲图片激情综合另类| 97国产精品久久久久| 激情五月天色色网| 色姑娘综合网| 青青草玖玖爱| 亚洲成人网站在线观看| 人妻一区二区三区四区视频| 使劲用力艹少妇视频一区二区| 青青久久手机线视频| 热热色综合网| 亚洲AV乱码专区国产噜噜亚洲 | 大香蕉综合久久| 狠狠色狠狠色狠狠五月| 亚洲高清欧美总合| 天天综合有色网| 亚洲一卡2卡3卡4卡乱码网站| 亚洲资源吧| 特污免视频| 啪啪免费| 起碰97| 久久精品视| 中文字幕日韩综合| 日韩色| 狠日欧美| 夜夜做夜夜爽精品视频| 视频在线观看一二三区| 色色色色网站| 国产日韩在线播放av| 中文字幕一区二区无码成人| 久久综合女优| 蜜臀久久99精品久久久老,,| 特级丰满少妇一级AAAA爱毛片| 97超碰大| 制服丝袜第二页| 亚洲AV资源| 国产欧美日韩在线不卡第一页| 视频国产成人精品日本亚洲18 | 激情色播| 欧美午夜视频精品久久| 欧美人与动性人交a| 日韩大香蕉AV影片| AV男人天堂网| 青青草色插素人| 九九热免费国产视频婷婷伊人五月| 看一级特黄a大一片| 思思热国产高清| 日韩在线观看AV| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊| 久久久久13| 亚洲成人综合在线| 久久精视频美日韩在线视频| 精品国产一区二区三区香蕉欧美| 无码久久国产| 91精品国产91久久青草 | 婷婷亚洲色| 欧美顶级黄片AAAAA在线免费看| 国产一级137片内射麻豆| 久久男人天堂| 91在线免费精品视频| 国产路线专区| 欧美精品庄| 欧美图片校园春色| 日本精品加勒比海一区| 国产丝袜一区二区三区| 中文AV制服乱伦| 日韩欧美日韩| 中文操逼字幕| 亚洲欧美国产中文视频| 蜜乳成人AV| 无遮挡男女激烈动态图| 亚洲无码国产探花在线观看| 人人弄人人摸| 国产在线观看91精品一区| a片在线播放| 999久久久免费精品国产牛牛| 国产精品人妻无码久久久老鸭窝| 国产精品久久久吖| 岛国在线免费视频| 亚洲高清无码在线桃色| 在线观看黄色电话| 丁香五月久久| 欧亚综合一卡二卡中文字幕| 97资源超碰| 精品乱子一区二区三区99| 熟女中出视频| 精品久久大胆人体| 国产天天噜一噜久久久| 啊啊啊啊无码| 亚洲综合电影| 国产精品亚洲一级av第二区| 福利在线观看一区二区| 丁香六月综合激情| 啊a一区在线| 1二区9| 丰满少妇精品一区二区| 中文字幕在线免费观看| 国产成人拍国产亚洲精品| 波多野42部无码喷潮在线观看 | 亚洲乱色视频一区、二区在线| 午夜经典| 91天射| 婷婷大香蕉| 人人透人人操| 青娱乐av在线| 岛国不卡超碰护士AV在线播放| 免费男人的天堂| 啊啊啊好想要| 国产综合网站在线播放 | 亚洲欧洲无码一区夜| 999色欧美中文字幕| 日本精品五区| 日本视频在线观看污污污| 亚洲黄色影视| 刺激精品视频| 97在线视频网站| 色综合天天| 久久丁香| 操老熟女AV| 男人在线天堂| 亚洲欧美在线观看2021| 熟妇视频一区二区三区在线观看| 亚洲综合射| 夜夜嗨视频| 欧美网站免费| 欧美日韩亚洲高清不卡一区二区三区| 一区e区三| 中文字幕日韩电影人妻| 久久精品欧美一区蜜桃| 一区二区三区四区五区久久久久久| 久久久精品| 中文字幕 国产 精品| 成人A片男人的天堂| 国产欧美另类久久久精品课程| 十八禁av无码免费网站APP| 97久久精品亚洲| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 国产久久久久久| 美女一区二区国产精品| 日本不卡二三区| 好色综合| 亚洲色天堂日韩中| 老司机香蕉久久久久| 免费观看的黄色的网站| 98精品国产乱码久久久久久| 亚洲无码偷拍| 成人精品电影| 91丝袜在线观看| 丁香五月色| 亚洲91射| 97最新在线播放视频| 超碰97在线色男人??| 国产一区二区三区免费视频在性观看 | 9久热| 97超级色碰碰| 亚洲成A∨人影院在线欢看| 欧美美女后入| 日本操逼视频导航| 日韩国产九九精品一区二区三区毛片| 亚洲精品人妻在线| 91男同| 新婚人妻扶着粗大强行坐下| 日本天天干天天日一区| 激情接吻视频久久久久久| 久男人久久| 欧美做爰无码A片视频| 中文字幕av一区二区三区人妻少妇| 国产亚洲精品av一区| 曰韩香蕉97| 婷婷影院入口| 加勒比色99999| www.久久| 家庭乱伦麻豆| 欧美综合制服在线| 欧美性爱视频免费一区一A| 美女上床网站| 日本超碰在线国产一区| 17c嫩草51久久91嫩草| 97激情97激情| 亚洲1区2区三区高清中文字幕| 久久九精品| 欧美一区二区三区日韩| 久热最新在线杭州| 亚洲天堂另类小说男人| 插穴性爱视频在线观看| 亚洲丝袜二区在线| 97视频在线观看播放与子乱对白在线……| 国产在线视频午夜精华在| 日日夜夜青青草母狗| 国产剧情AV不卡在线观看| 好涩综合| 人人澡综合涩| 亚洲精品视频在线| 五月天婷婷在线看| 99久在线精品99re8热视频在线| 秋霞视频一区二区 | 免费一级精品啪啪视频| 超碰久在线天天做| 99re视频在线观看这里只有精品| 日韩成人私密一级精品av| 国产第二页| 丝袜美腿诱惑亚洲欧美视频在线观看| 在线人成亚洲视频免费观看| 夜夜夜夜爽| 久久亚洲骚逼综合| 亚洲欧美在线观看2021| 伊人操| 色哟哟av网址| 熟妇最新先锋一二三区| 欧美成人黄网色网站| 在线视频免费观看午夜| 精品制服美女中文一区二区三区| 日韩精品三区四区| 亚洲AV无码乱码在线观看性色| 亚洲巨爆乳一区二区三区四季网| 97超碰中文字幕| 99国产天美| 久久伊人大香蕉| 多毛小伙内射老太婆| 精品九九九九九| 欧美在线第五页| 97爱爱影院| 综合熟女| 日韩中文字幕二区| 在线观看AV片| 人妻偷拍一区二区三区| 色妇综合网| 91四海无码日韩欧美| 超碰这里只有精品| 99自拍B亚洲 | 亚洲情色 欧美| 精人妻无码一区二区三区伊人直播 | 中文字幕精品久久久久人妻红杏ⅰ| 色五月婷婷麻豆在| 不卡啪啪视频| 日韩丝袜二区| 在线精品福利免费播放| 久久精品毛片免费不卡| 6080YYY午夜理论片在线观看| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 国产一区二区啪啪视频| 久久九九视频九九视频| 五月天丁香| hd成人一区二区在线| 精品久久久久久中文| 日韩精品在线视频在线观看| 日韩一级性爱无码| 午夜舔阴达高潮视频免费看| 欧美亚洲综合高清在线| 天天日夜干| 国产一二三在线视频五十路| 一区二区视频在看| 酒色综合网| 欧美激情专区| 狠狠干91| 欧美成年人性爱视频免费观看| 国产精品国产精品国产| 91熟女视频| 国产在线观看一区二区三区| 中日韩免费看男女操逼大全| 草草电影院| 97超碰磁| 交换娇妻呻吟声不停中文字幕| 日韩簧片免费看| 欧美日韩免费性爱| 国产区性爱在线视频秋霞豆| 欧美人人AAA| 97人人干人人操| 91久热| 91亚州日韩高清| 色九月综合| 中文字幕AV片| 欧美性少妇| 熟妇熟女一区二区三区| 日韩三级伦理中文字幕| 国产一区二区三区久久久精品| 日本无码1| 亚洲欧洲网站免费观看| 乱精品一区字幕二区| 少妇被玩视频二三区| 欧美性爱网97| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 夜夜操2028| 国产午夜视频| 国产一区二区在线看| 夜夜嗨视频| 中国一级特黄大片护士| 欧美v亚洲v日韩v最新在线二区| 中文字幕五区| 中文字幕综合人妻| 欧美+日产+中文| 三级AV入口| 久久婷婷视频| 日韩激情视频| 欧美碰碰综合色| 欧美性爱免费短视频| 东京热免费视频| 区一二区日韩亚洲乱码av电影| 粉嫩av一区二区三区四季| 亚洲视频精选| 欧美成人AⅤ大片在线观看| 97婷婷色| 在线观看午夜婷婷久久久久清性观看| 日韩精品一区二区人人人| 日本高清免费一本视频在线观看| 国产精品爽爽va在线观看98| 亚洲中文字幕有码视频一区二区三区| 日本精品九九九| 日韩肏逼视频| 91GD.COM| 骚女高跟AV在线| 欧美亚洲天堂| 色婷婷久久| 成人在线午夜视频一区| 狠狠操使劲操| 综合色99| 亚洲色图综合网| 欧美组图日韩亚洲中文字幕| 一级A啪啪啪啪| 熟妇人妻一区二区三在线| 一区二区三区不卡视频| 亚欧高清在线| yy少妇精品久久| 精品人妻一区二区三区四区石在线| 探花激情视频| 97超碰这里只有精品| 久久久久久99AV无码免费网站| 九九色色| 亚洲乱熟女一区二区| 天天色天天干天天射| 九九热免费在线国产视频伊人五月| 中文字幕国产| 色综合久久88色综合久久天天| 天天综合网在线| 热99这里有精品综合久久| 人妻中文在线| 97网站在线观看 | 啊啊啊啊操死我了| 欧美传媒| 嗯嗯嗯啊啊啊操的我好爽| 欧美天天综合网版| 99色婷婷| 视频二区美腿制服人妻欧美| 国产版a级片直播在线| 97超碰人人模人人拍人人| 97色干| 麻豆一区二区三区在线看 | 国产夜夜艹| 97超碰碰| 精品久久久久9999| 粉嫩av平台| 亚洲综合性感在线| 精品成人无码| 加勒比伊人综合| 欧美,日韩综合久久| 亚洲999综合| caoni国产亚洲av| 长久操视频| 国产 日韩 另类 视频一区爱| 囯产精品强| 黄片在线免费在线观看| 9久9久9久9久视频网站| 久久久婷| 黑人娇小av在线播放| www四虎| 国产精品探花色| 99久在线精品99re8a| www.91理论| 久久99久久99精品天美传媒棢·纸:. | 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲国产成人综合碰碰三级经典| 亚洲美乱| 1人人看人人摸人人操| 九九九九免费高| 日韩久久激情精品| 麻豆成人AV| 欧美老妇综合网| 亚洲人妻中文高清| 国产精品农村妇女| 天天日日日射| 性色av蜜臀av色欲aV| 熟妇人妻一二三区免费| 97超碰美国| 18禁精品网站在线看| 91无码人妻精品一区二区三区蜜桃| 精品久久久久久亚洲| 强奸乱伦AV一天堂网| 狠狠做深爱婷婷久久二区| 日本午夜久久电影| 国产精品成人AV片免费看网站| 嗯嗯啊啊好疼| 色优久久| 台湾成人无码AV| 欧姜老司机| 啊啊啊啊操死我了| 欧美日韩99| 亚洲国产精品99久久久| 91欧| 99色骚| 蜜桃成人1区2区3区| 国产精品无套内谢| 夜夜精品视频| 人妻无码视频一区二区三区久久| 伊人亚洲国产一成人久久精品,久久| gogogo免费高清看中国国语| 凹凸 69堂 在线播放| 乱码熟妇人妻久久久| 六十路日本| 国产日韩欧美中文在线播放| 欧美在线啊啊| 青青草导航在线视频| 99999精品成人| 色婷婷综合网| 久久国内| AV和黑人在线播放| 国产成人久久精品蜜臀| 日韩在线观看AV| 日韩美女高潮喷水视频| 亚洲骚女一区二区三区| 精品国产久热在线观看| 国产一区二区三区免费视频在性观看| 日韩一级二级三级| 少好三P| 亚洲区限制级| 欧美一区二区情色| 中文字幕五区| 99久久99九九99九九九| 亚洲 日本 国产 综合| 亚洲一区二区在线观看91| 国产97在线播放| 在线情色电影 91大| 色鬼在线综合| 亚洲欧洲视频小说在线观看| 99九九久久| 天天色播亚洲综合网站| 3d成人精品一区二区| 摸奶性爱视频网站在线免费播放| 欧美天天干| 日韩精品人妻中文字幕不卡乱码| 日韩欧美偷拍美女视频| 97精品视频免费| 中文字幕视频2区| 91狠狠综合久久久久久| 成人五月香网在线| 99热精品在线| 日韩久久三区| 婷婷六月天| 麻豆久久久一区二区| 久久婷婷亚洲| 精品久久99| 91久久婷婷| 水野优香在线观看| 香蕉在线一区二区三区| 蜜臀国产AV中文字幕| 国产精品一区人妻精品阁在线| 日韩AV一区二区三区四四| 69人妻精品一区二区绯色| 首页亚洲国产高跟丝袜诱惑视频| 久青草影院| 蜜臀久久99精品久久综合| 人人色97| 国产白领连续中出在线观看| 蜜臀亚洲中文| 330Dv国产女人终合视频极品人与兽| 亚洲人在线成线成人| av亚洲天堂资源网站| 欧美夜色| 无码精品啪啪啪一区二区三区三州| 91国产伊人大香蕉| 男人的天堂com| 超碰午夜| 再深点灬舒服灬太大了添视频 | aV中文麻| 黑人猛交| 中文字幕在线观看永久| 国产精品香蕉热久久新品| 久久这里只精品99re66图| 一区二区你上我| 国产超碰在线一区| 欧美激情亚洲情色| 久久久久久久久久久久色网| 天天综合网日韩| 久久久久久亚洲Av无码| 色综合久久88色综合久久天天| 国产精品国产拍高清AV| 国产精品久久久亚洲一区| 欧美色图亚州激情| 人人摸人人舔一区二区| 亚洲欧美洲综合| 92性色国产午夜福利在线661| 欧美日韩国产中文精品字幕自在自线| 中国亚洲呦女专区| 炮色五月| 最新9久久久9免费视频| 78超碰| 久久直播国产| 97资源制服丝袜| 97 九色| 高清视频一区| 国产成人午夜视频网址| 色五月激情网| 亚州综合AⅤ| 亚洲欧美洲综合| 欧美一区二区三区四区综合| 亚洲色综合| 欧美999999| 97超碰超碰| 日韩一级成人毛片免费观看| 精品女人999| 欧美大色交| 张柏芝国产一区在线观看| 日韩欧美亚洲一区二区三区影院| 超碰日本97美女人妻人人玩人人爱| 强奸熟女一区二区三区| 又大又大又大又粗爽高潮观看| 操逼操逼逼操操逼91| 亚洲天堂另类美腿| 97在线播放| 色欲av一区二区三区蜜芽| 男人的天堂啪啪啪啪啪蜜桃不卡| 国产性爱欧美性爱在线| 国产精品高潮久久久无码| 午夜男人一级A片7777| 白 大 人妻 区 在线| 久久97超碰| 婷色五月| 97射欧美| 黄色AAAAAAAAAAA大片| 欧美大香蕉97| 欧美组图日韩亚洲中文字幕| 91日本在线观看| 加勒比五月天| 成人无码电影在线观看网| 亚洲熟妇丝袜在线观看| 欧美在线天堂| 色婷婷视频| 欧美色吧综合| 亚洲古典另类欧美在线| 日韩视频小说在线观看 | 乱欲性色| 黄色大片免费在线| 欧美九九99久久精品| 碰碰97| 国产剧情一区在线观看| 日韩无码第3页| 日韩在线观看中文字幕视频| 欧美激情黑人| 蜜乳性色无码专日粉嫩骚逼AV| 和协影院中文字幕三区| 欧洲亚洲国产综合在线| 天天综合有色网| 操操操五月天婷婷丁香影院| 夜夜操91744565| 日本精品五区| 九九九九九九九九九九九免费国产| 色臀AV| 蜜臀久久久久久999| 亚洲男人天堂av| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 日影院久久婷婷夜夜网| 久久综合亚洲色1080p| 麻豆成人av| 欧美系列在线一区二区| 欧美性五月| 久久九九网| 亚洲天堂男人网| 国产人伦精品一区二区三区| 久久久99免费| 国产一区二区久久| 色牛牛AV| 亚洲欧美黄| 久久视网78| 久草网站免费在线观看| 欧美图片校园春色| 日韩人体偷拍| 国产一级内射无挡观看| 日本中文字幕熟妇| 操91| 大香蕉免费3| 99在线啪| 五月天婷婷欧美三区| 欧美人与动性人交a| 国产情色第一第二页在线观看| 中文字幕亚洲在线一区| 亚洲精品97久久| 欧美性爱一区| av凤凰久久久| 免费a v| 日本欧美m v精品网站加| 免费观看啪视频| 久热91| 91亚洲狠狠色| 天天透伊人| 色色网91| 中国少妇啪啪视频| 91九九九逼| 自慰白浆在线观看| 男人午夜天堂| 日韩大香蕉精品在线视频| 九九无码| 国产成年免费大片黄在线观看| 欧美综合中文| 岛国人妻少妇av在线观看| 亚洲第一在线视频| 一区二区三区精品视频| 99精品人妻| 国产和美国毛片| 91女在线观看| 国产又大又硬又长又粗| 久久狠狠色噜噜狠狠狠狠97| 欧美色图人妻| 亚洲熟女国产综合另类| 亚洲av淫乱| 国产又色又粗又黄又爽| 91美女精品| 制服中出中文人人精品| 116美女午夜| 日本午夜福利影院| 一二三四视频中文字幕在线看| juliaann欧美丝袜办公室| 久久99草| 亚洲人在线| 日本三级中国三级99人妇网站| 黄在线| 国产无吗在线播放| 舔足天天操天天射| 欧美亚洲清纯| 涩涩久久精品| 亚洲综合图文| 欧洲无码一区二区| 亚洲欧美精品福利在线| 国产一区在线观看无码AV| 婷婷婷婷婷婷久久久久| 欧美春色| 91模特在线观看| 九七毛片九九毛片 | 操屄日韩| 九久精品| 人妻少妇精品久久久久久| 亚洲AV在线资源| 亚洲男人的天堂在线看| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 玖玖无码超碰| 91激情国产| 久久久九精品| 噜噜噜亚洲精品| 97碰碰日本乱偷人妻中文的| 婷婷色香| 精品人妻夜夜草| 日本免费不卡二区| 欧美中文字幕男人天堂久久精品 | 96爱综合| 亚洲激情 欧美色图| 亚洲国产精品久久久久婷婷青年| 天天射影院| 黄污污污污| 超91综合网| 久久亚洲影院一区二区| www.狠狠干.coom| 九色97| 91色女| 一及黄久一点| 色情亚洲日本成人| 大香蕉国产中文自拍| 久久爽爽精品| 新视频sss国产| 国产人妻精品一区二区三区秋霞| 亚洲精品一区二区免费在线观看| 亚洲限制级| 久久一本大香蕉| 91色综合色| 91欧美情色| 少妇精品久久| 成年人网站在线免费观看| 日韩极品无码B| 久久精品毛片免费不卡|