日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
一区二区激情国产熟女| 丁香婷婷大香蕉| 色黄色美女大长腿午夜视频| 女人双腿搬开让男人桶| 小少妇| 婷婷色在线| 中文字幕一区av| 啊啊啊啊啊好舒服视频| 老熟女乱伦片| 插入逼91| 91社区伊人| 97色亚洲| 五月丁香啪啪网| 亚洲18禁| 青青草玖玖爱| av激情亚洲五月天| 操逼视频亚洲| 亚洲熟女综合| 熟妇激情| 囯产精品久久久久久久久久梁医生 | а√天堂资源官网在线资源| 黄片www.| 亚洲婷婷五月天| 色亚州人久干视频在线观看免费版| 9Ⅰ超碰| 美日韩男女操屄视频| 欧美Aⅴ| 国产理论视频在线播放| 久九干| 久艹免费| 91影视亚洲| 欧美黄片视频在线观看免费 | 动漫爆乳3D奶水一区在线观看| 精品九九国产无码| 中文久久一区| 久久精品国产Aⅴ| 日本一区二区三区四区免费观看| 2000亚洲男人天堂| 亚洲 自拍偷拍 欧美| 亚欧中文字幕在线视频| 成人av福利在线观看| 日韩 人妻 精品| 欧美激情色婷婷花野真衣一区二区| 熟妇一区二区| 亚洲日韩av一区二区三区百合| 久操国产在线| 国产熟女少妇一区| 亚州综合色| 国产这里只有精品| 男人的天堂com| 韩国成人精品久久久免费看| 欧美激情亚洲情色| 色欲蜜臀AV| 久久精品人妻一区二区三区| 天天综合色电影| 最近二区三区视频大全| 伊人久久久日韩一区| 一级黄色视频网| 蜜桃久久久久久久久久久久| www.av在线观看| 一区二区三区高清| 欧美日不卡| 亚洲欧美色图片| 97青青操视频| 久久久免费的精品| 无码精品啪啪啪一区二区三区三州| 超碰在线国产| 伊人精品久久网站| 日日骚一区二区三区| 东京热男人的天堂网| 国产精品视频内谢女人| 97视频在线免费播放| 中文字幕在线日亚州9| 男人的天堂2018| 欧美综合在线91| 日韩成人电影AV| 91福利网在线观看| 亚洲狠狠入| 精品性爱一区二区| av最新免费中文字幕| 91欧美色| 久草色悠悠在线视频| 丰满精品人妻少妇久久字幕| 精品国产一区二区三区久久久蜜臀 | 欧美日动态视频| 欧美性爱十八禁| 亚洲一区二区av| 97在线视频观看| 2020中文字幕在线观看| 亚洲色图 图片| 一区二区三区日韩欧美| 五月丁香啪| 91人妻做a观看视频| 色y情视频免费看| 久久免费9| 91丝袜在线视频| 躁躁日曰躁2020| 九月婷婷综合| 熟女性视频| 不卡免费av在线播放| 久久久久久久久久va| 99久在线精品99re8热| 天天干人人干天天日97| 日韩丝袜高跟制服在线观看| 欧亚久久偷拍视频| 久久精品男人的天堂| 亚洲美女30b| 台欧久久精品视频| 操久久久久久| 你操综合| 2019天天操天天爽天天拍| 欧美最婬乱婬爆婬性视频 | 中国亚洲呦女专区| 九月丁香| 秋霞一区二区三区四区五区六区七区| 久久97超碰香蕉| 伊人96在线| 97公开久久| 性爱AV天堂| 国产吹潮女在线观看| 一区中文字幕二区日韩| 日韩电影天堂视频一区二区| 日本最新1区2区3区| 亚洲欧美激情小说| 国产成年女黄特黄| 欧美久久九九| 热热热热日日漂亮永久永久国产日| 97久久精品亚洲中六字幕| 激情四射熟女丝袜| 五月色丁香| 九九九九久久久| 爱我干综合| 神马久久中文字幕| 操学生天天| aV中亚| 校园春色家庭伦理欧美激情| 夜夜操一区二区| 中文字幕午夜精品久久久| 91free福利| 国产97在线播放| 黄片在线免费在线观看| 亚洲欧美综合| 国产日韩精品suv| 亚洲精品三区在线观看| 国产精品电| 国产久久一区二区三区野外在线| 人妻插插人妻人| 久久精品视频在线观看| 97干色| 9国产超碰| 久久久新亚洲AV| 国产精品蜜乳AV| 黄色在线网站| 综合日韩激情另类图片| 亚洲欧洲色情高清| 欧美精品99久久久**| 2019AV天堂| 日韩偷拍色图| 麻豆 欧美 日韩| 偷拍欧美激情| 欧美在线l亚洲| 日本少妇va7777| 欧美视频激情久久久久久| 国产欧美日韩女同性恋ww喷水精品| 少妇滛荡视频| 久久色激情一区二区三区| 殴美综合色88| 久久精9| 精品视频久久区| 91精品国产乱码| 中文久久96| 久久久久久中文版| 九九九九97| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 一区在线精品中文字幕| 欧美乱伦专区| 超碰成人公开| 在线精品福利免费播放| 免费看毛片操穴| 男人的天堂啪啪啪啪啪蜜桃不卡| 亚洲国产剧情少妇激情| 国产精品久久久久久9999| 啊啊啊啊无码| 日本综合色图| 国产亚洲女v在线观看| 在线观看精品国产免费| 99999精品成人| 青女在线| 青春草A| 成人精品视频| 欧美色综合网| 中文字幕av亚洲精品| 亚洲国产精品无石码久久 | 精品成人av一区二区三区在线| 国产精品久久久久久久毛片1| 99热这里是精品| 麻豆精品A片免费观看| 日韩欧美天堂| 手机午夜电影神马久久| 欧美精品第3页| 综合网亚| 97精| 国产精品久久伊人| 内射白嫩美女| 91制服丝袜| 一级片在线观看高清无码| 99爱在线视频| 91美女在线精品视频| 国产乱人妻精品入口| 久草精品一区| 无码丰满熟妇一区二区浪潮AV| 午夜精品久久一区二区| 国产h小视频在线观看免费| 老熟妇一区二区三区…| 天天躁狠狠躁av| www.黄色在线| 97超碰磁| 超碰av人人人| 亚洲双插| 久久香蕉综合一本到3atv| 欧美九九99久久精品| 香港久久久| 亚洲精品一二区| 日韩国产品视频中文字| 亚洲第一页色网| 大香蕉综合| 伊人久久国产免费观看视频| 亚洲av综合色区图片亚洲| 超碰到97情色| 成人av福利在线观看| 黄片直播三级黄片两女一男| 亚洲男人天堂网久久| www狠狠| 国产成年女人免费视频播放a| 荡小穴在线观看| 国产sv美女内射| 热久久精品| 超碰精品人妻狠狠干| 9997se| 一区二区三区 丝袜高跟| 97超碰欧美中文字幕| 久久久亚洲欧美综合| 欧美成人9797| 成·人免费午夜在线观看| 人人摸人人干人人拍97| 亚欧操逼片在线观看 | 91精品久久综合熟女| 蜜桃视频一区二区三区 | 国产人人干| 26UUU欧美激情一区二区| 久久亚洲不卡一区二区三区| 亚洲狠狠入| 久久久男人的天堂| 婷婷亚洲五月***久久| 97视频在线免费| 天天影视网综合少妇| 丁香五月天激情综合| 艹比视频国产精品| 亚春色色| 日韩精品区二区三区不卡| 精品无码少妇| 91在线|亚| 91亚洲综合| 性videos欧美熟妇hdx| 亚洲男人天堂网久久| 伊人网青青| 欧美日日夜夜| 精品国产91内射久久| 大香蕉免| 亚洲情色1区| 97精品一二区| 蜜桃狠狠色伊人亚洲综合网站| 久久久久久日韩| 欧美日日夜夜| 97人肏| 无码一区二区三区四区五区六区七区八区九区十区视频 | 91日日| 国产精品岛国片在线观看| 久久丁香| 丝袜 中出 制服 人妻 美腿 中文字幕| 日逼97| 国产一区二区三区导航| 欧美劲爆第一页| 九九av| A级在线视频| 久久一二三四| 国产一级特黄大片处女| 亚洲欧洲国产综合av| 九九久久精品| 欧美一区二区成人一卡| 国产免费内射视频| 搡老女人老91二区| 日本97久久久精品| 97超碰逼| 欧美精品久久96人妻无码| 久久视网78| 青操影院| 可以免费观看的AV| 久久人妻| 欧美熟妇人体| 黄色av网站在线播放| 97精品中文字幕| 天天做日日爱夜夜爽| 欧美性爱一区二区三区| 三级三级三级日本99| 美女诱惑久久| 欧美日韩电影一区二区| 99热91| 青青草在线视频美女| 91在线免费观看处女| 中文字幕日韩人妻视频一区二区三区 | 99热销国产这里有精品| 国产av热热色| 九一综合精品视品av| 午夜激情成人在线观看| 久草尤物| 97伊人网| 精品熟女呻吟久久91| 一区二区首页| 五月天伊人| 天天射影院| 一区二区精品日韩欧美在线观看 | 丰满精品人妻少妇久久字幕| 97在线国产精品| 婷婷亚洲天堂| 温婉少妇玩3p| 亚洲97久久精品亚洲| 免费成人在线观看91| 天天噜| 国产99999久久精品| 国产宅男宅女在线观看| AV天堂男人的天堂| 五月天婷婷基地| 岛国激情视频在线观看| 亚洲欧美自拍偷拍| 精品成人女人久久| 韩国成人精品久久久免费看| 福利在线视频一区二区| 福利操逼| 超碰 另类 欧美| 欧美日韩国产高清在线一二三区 | 久久久久国产精品片区无码直播 | oumeisetu综合| 蜜桃在线观看一区二区三区 | 亚洲无码一区成人免费午夜| 亚洲一级性爱视频免费看| 国产午夜在线观看| 亚洲精品蜜桃久久久| 91N综合在线| 综合影院亚洲| 97这里只精品| 91日韩| 五月婷婷综合网| 啊啊啊啊在线观看网址| 人妻AV 中文字幕的| 每日更新AV| 欧美顶级黄色大片免费| 免费夜夜爱黄色视频毛片| 超碰偷拍| 欧洲精品在线播放| 欧美日韩小说| 人妻内射一区二区在线视频| 好看的91视频| 躁躁躁日日躁2020| 思思热免费在线视频| 久久婷婷色| 美国久久一二三四| 亚洲深夜福利| 无码在线亚洲| 97色论| 91综合天天| 人妻性爱一区二区| 99在线精品观看99| 欧美性天天影院| 一起草三级AV电影在线观看 | 久久亚洲AV成人精品无码| 亚洲激情视频| 欧美aaaaaaa| 不卡超碰护士AV在线免费播放| 亚洲日韩XXX| 日韩偷拍一区二区三区| 大香蕉AV丝袜| 97超碰中文在线| 色色婷| 天天天堂影视日韩亚洲91| 国产JDAV无码视频在线观看| 欧美黑人XXXⅩ高潮交| 青青操在线视频| 福利在线观看一区二区| 91亚·色| 啊啊啊好想要| sss视频华人在线| 精品一区二区三区18| 97 色综合| 婷婷九月色| 亚洲国产一区二区三区在线| 伊人久久亚洲中文字幕不卡| 久久九九精品一区二区| 日日碰狠狠添天天爽超| 狠狠91| 熟女人妻av在线资源,黄色的资源| 欧亚在线视频| 亚春色色| 福利在线观看一区二区| ′ !γ}丶。。久久精品欧美一区二区三区| 欧美同性恋 的搜索结果 - 91n| 啊啊啊啊啊啊啊在线| 大香蕉狠狠爱| www.四虎在线| 久久直播国产| 夜夜高潮夜夜爽高清视频一| 久草电影网| 波多野结衣被操50分钟免费视频| 六六久久日韩不卡| 97超级色碰碰| 在线免费观看高清无码视频| 国产精品无码论坛| 97超碰护士| 人人操人人摸人| av操操不卡| 强乱老妇中文字幕| 国产大片精久久久久久| 深夜激情无码| 亚洲天堂电影网| 狠狠操狠狠爱| 1区2区3区在线视频| 一区二区三区看视频| 九色精品视频导航1| 日日爽熟女| 91 亚洲 欧美 日韩 国产 综合| 青青草在线成人视频| 国产精品麻豆视频网站| 欧美aⅴ99久久黑人专区| 一区二区视频在线播放| 亚洲永久永久永久永久一级一级一级精品 | 少妇激情一区二区三区视频| 99999久久精| 国产传媒美日韩av| 成人午夜无码视频| 久久老熟女| 久久久久久久久女黄| 亚洲国产一级精品毛一级精品看免费视频| 97资源亚洲| 亚洲AV成人在线| 强奸国产精品视频| 国产精品久久久久久夜夜夜夜| 婷婷午夜| 蜜臀久久99精品久久久电影| 人妻啊啊人妻啊啊| 欧美日韩另类在线播放| 久噜噜| 超碰激情808| 日本九九久久99| 97精彩视频网站| yaouchengrenav| 9118禁| 91大学精品激情戏| 国产综合色精品在线观看| 亚洲 欧美综合| 超碰天天去日穴| 久久久久久久9最新免费视频观看| 天天夜躁日日躁狠狠2002| 国产精品在线免费| 欧美精品 - 91爱爱| 国产精品肉丝自拍| 激情干在线| 综合影视国产无码| 超碰97人人cao| 欧美亚洲天堂| 97亚洲综合| 97干综合网| 日韩中文9| 精品人妻一区二区三区蜜桃视频| 97天堂| 色综合av男人天堂| 97干97色| 激情小说亚洲视频| 亚洲日韩97| 97操在线| 久射吧| 久草精品国产蜜臀| 五月婷婷青青草娱乐伊人| 91成人久久 | 日韩高清黄片| 久久大香蕉97| 果冻传媒A片一二三区| 亚州综合色| 一二三区精品视频| 92性色国产午夜福利在线661| 亚洲一级性爱视频免费看| 亚洲丝袜综合| 日本十八禁免费看污网站| 在线人人人人人人精品超| 国产福利在线视频网站| 日本操逼视频在线| 做爱A级亚欧| 99综合免费视频| 日本三级小说中文字幕| 久久侵犯人妻爽爽爽| 精品久久久久,69国产成人精| 操逼内射干逼白丝91| 91美腿丝袜在线观看| 亚州男人的天堂| 精品人妻一区二区三区日产| 可能人人看人人摸| 亚洲日韩美国人妻| 800zy一区二区| 一区二区你上我| 99激情视频| 欧美在线中M| 亚洲欧美成人网站AAA| 在线综合 亚洲 欧美中文字幕| 丝袜熟女一区二区三区| 在免费jIzzjIzz在线视频| oumeisetu综合| 日韩三级性| 久久久久幕乱码| 女欧美一区二三区| 亚洲春色激情小说| 精品妇操一区二区三区| 情色五月天久久久| 96精品久久久久久久久久| 91黑人无码激情在线| 丰满的三级少妇欧美久久久| 亚洲春色激情小说| 青青在线视频免费| 六十路日本| 国模久久在线| 无码WWW免费视频网站| 日本日日色视频| 97综合网| 免费人人搞97| 无码动漫av中文字幕| 大香蕉伊人色偷偷在线| 欧美高清色| 青青网三级视频| 操美女高潮抽搐白浆| 美女在线H91| 99热日| 看免费一级在线播放毛片| 国产热RE99久久6国产精品首| 欧美亚州色的图| 国产AV激情无码久久无码| 久操在97| 免费操逼视频下载| 久热精品在线| 伊人成人中文字幕久久网| 97超碰中文字幕| 亚洲欧洲av影音| 欧美性爱五月天| 亚洲国产日韩精品久久久| 校园春色制服丝袜中文字亚洲| 日本不卡二三区| 国产综合网站在线播放| 夜夜骑日日| 国产91美女高潮| 日韩免费簧片| 久久久男人的天堂| 人人人人插| 60秒试看最爽10分钟网站| 亚洲97在线| 啊啊啊啊啊啊啊啊啊啊在线观看| 亚洲精品成人激情在线| 亚洲 欧美 日韩 国产一区二区| 东北黄色电影| 啊好大好舒服| 粉嫩av一区二区三区天美传媒 | 精品女同一区二区三区| 激情综合网亚洲| 狠狠操夜夜| 长长久久88视频| 9 1果冻精品视频| 国产超碰| a啊啊啊啊啊啊啊啊一区二区| 欧美午夜一区二区三区| 91精品少妇搡搡搡| 国产超碰| 97色亚洲| 蜜桃久久久久久久久久久久| 另类 日韩 熟女| 传媒在线观看一区二区三区| 激情99| 熟女一区二区| 国产精品久久久久中文字幕| 男女啊啊啊| 啊啊啊好湿国产一二| 亚洲熟女诱惑| 超碰精品| 丁香五月婷婷色| 日韩成年人性爱视频| 九九九九九九成人| 国模不卡| 久久久久久9| 9精品久久| 人人干人人搞人人摸| 精品免费囯产一区二区三区 | 欧美美女在线高潮999| 国产成人欧美一区二区三区的国产| 久久人妻少妇| 哈哈操电影AV| 91丨九色丨大屁股| 国产精品亚洲无码| 91天堂网| 中字一区| 日韩激情视频| 国产精品久久99日日| 97爱亚洲| 日本ZZ高免费A级视频| 天天天乱色综合全| 狠狠狠一区二区三区| 久久久久国产一区二| 青娱乐淫乱1314| 91痴汉| www.成人无码| 视频在线中文字幕| 区二区亚洲婷| 操操操操操操| 九九九九九九亚洲| 国产免费一区在线观看| 日本午夜操逼| 老鸭窝在线视频播放| 色www精品视频在线观看| 亚洲影院小综合| 精品久久青青草| 日韩啪啪啪啪啪| 婷婷五月色| 婷婷久久综合| 婷婷久草一区二区三区| 99久久精品无码一区二区| 91av一区二区在线观看| 色欲三区| 欧美精品99久久久**| 亚洲小说视频| 国产精品播放| 一级毛片电影免费看| 婷婷婷婷婷婷久久久久| 国内毛片热久久思思热| 国产兽交视频在线播放| 高潮的A片激情扒开一区| 国产一区自拍欧美日韩| 免费αV在线视频| 亚洲成人性爱网站在线播放| 操逼国产免费| 成人黑料社久久| 久久曰曰| 看日韩操逼| 猛交交| 啊啊啊啊啊啊好湿好爽视频| 激情婷婷丁香| 69一区二区三区| 97香蕉网| 人妻日日干| 亚洲男人天堂Av| 久久久亚洲精品电影免费看| 人人搡人人肉久久精品| 麻豆精品.欧美精品.日韩精品.| 97视频在线播放| 亚洲无码成人精品| 操99| 天天操女人| 操人妻丝袜高跟| 97 国产一区| 88在线一区二区三区| 女性喷水高潮在线观看| 老熟妇一区二区三区…| 色哟哟的毛片| 亚洲高清男人天堂| 呦呦一区| 综合 欧美 亚洲 日本| 日韩丰满熟妇| 麻豆久久久久久久久丝袜 | 最新日本中文字幕| 婷婷色导航| 97操97色| 超碰偷拍| 岛国视频一二三区| 丁香五月电影| 97资源站久久| 日韩精品一区二区高清| 九九在线精品| 粉嫩久久久极品| 亚洲AV无码乱码| 嗯啊不要啊在线 | 婷婷操视频| 天天操夜夜操| 色欲色香天天天综合网www-亚洲综合国| 中文字幕免费在线观看| 手机在线视频国内精品| 婷婷香蕉欧美在线一区二区三区| 亚洲日本韩国在线| 中文字幕免费看| WWW啪啪的com| 狠狠躁AV| 精品蜜乳AV免费观看| 蜜桃视频精品一区二区| 污污污8888| 狼人狠干| 屌逼传媒| 91中出| 麻豆国产原创AV色哟哟 | 吊色| 无码操逼视频一下| 欧美老妇女内射网址| 久久国色天香香蕉| 91综合在线| 风间由美日韩欧美久久| 成人性爱全视频观看| 天操天操夜操夜月月年年操操 | 乳欲人妻办公室奶水| 国产欧美黑人丰满在线| 欧美高清无码免费视频高清版| 九九九九88| 国语av狠狠色丁香婷婷综合激情| 亚州成人a∨| 精品人妻一区二区视频| 超碰在线1234区| 五月激情影院| 久久大黄片| 欧美五区| 人妻熟女av国产网站| 国产在线激情| 日韩AV色图| 亚洲av性爱电影| 精品中文日韩字幕视频| 色五月综合| 精品91日日夜夜超清资源| 精品久久久中文字幕不| 国产精品免费日韩| 欧美日韩妖精91com| 日本欧美韩国日产片片在线看免| 国产家庭乱伦表演| 国产夫妻性生活视频| 中文一区二区婷婷视频| 在线观看不卡一区二区三区| 超碰1997| 91九久| 另类 日韩 熟女| 国产精品日日摸夜夜添骚逼| 熟妇国产免费一区| 无码又爽又硬又激情免费视频| 日本αv| aV中文麻| 香港澳门日本三级网站| 日韩人妻无码不卡网站| 久久精品99久久久久久| 欧美五区| 超碰久热| 亚洲日韩美国人妻| 9 1果冻精品视频| 伊人色综合欧美| 亚洲精品一二三四区| 色区久久| 激情抓乳插进去啪啪啪日韩| 成人精品在线免费视频| 欧美黄业| 亚洲脚交| 蜜桃臀一区二区三区久久| 婷婷色一区| 九九内射在线| 黄网在线播放| 超碰在线1234区| 夜夜操青青草| 最新无码国产| 日韩黄色av中文字幕| 亚洲黄片免费在线播放| 91在线免费精品视频| 青青草中文字幕| 精品久久97观看在线视频| 激情视频一二三| 私色综合网| 五月婷婷综合网| 久久精品性| 欧美日韩操逼嗦吊| 婷婷尹人大香蕉免费| 日本三级中国三级99人妇网站| 黄网色一区二区三区四区精品| 看日韩操逼| 超碰色美女| 夜夜躁狠狠躁日日躁av| 亚洲综合色图欧美| 日逼97| 秋霞色色影院| 草草影院最新网址| 天天色黄色影院天天操| 久久国产免费激情视频| 国产一级操B视频| 欧美性爱在线无码| Julia在线播放亚洲久久| 中文字幕国产精品1区| 午夜精品久久久99| 五月天伊人| 曰本熟女视频| 久久熟女久| 人人操人人精品影片| 日少妇视频| 日韩在线观看三级电影| 国内毛片婷婷六月色| 午夜一级免费毛片| 亚洲色啪| 青青草黑寡妇男人天堂| 久久亚洲日韩国产欧| 激情小说在线视频| 黄色区免费观看中文字幕| 二男一女成人A片| 亚洲成人福利电影免费| 天天干天天日天天射黄色| 9热9热综合网| 色噜噜国产精品视频一区二区| 三级特黄60分钟播放| 婷婷大香蕉| 日本精品性生活久久久| 亚洲欧美黄| 视频分类 国内精品| 精品视频专区| 91肉片| 91碰碰| 青青草玖玖爱| 欧美亚洲国产91在线| 五月天偷拍| 综合网欧| 一级AAA片一区二区三区| 亚洲国产尤物yw在线观看| 91女在线观看| 亚洲一区操| 丰满人妻一区二区三区| 久久999久| 91久久婷婷| 日韩久久.一级黄色片| 九九热免费在线国产视频伊人五月| 天天干夜夜鈤| 国内三级自拍小视频在线观看| 一直超碰| 欧美一级黄色免费专区| 国产av高清版| 欧美色图色综合| 中文字幕性感少妇av| 色欧洲97| 探花熟女,姿勢到位,體驗感也到位| 欧美日韩婷婷中文| 九热大香蕉| 久久久97| 高清不卡一二三区视频......| 亚洲天天自拍| 殴美牲| 中文久久96| 久草免费福利在线播放| 五月婷婷综合网| 亚洲资源一区| 天天香香欲综合| 国产精品亚洲无码| 亚洲凸凹超碰成人| 久久99午夜精品一区人妻| 我想要啊 啊 啊| 综合色色网| 久久专区| 久久99手机免费视频| 日韩人妻播放| 大香蕉中文在线| 97精品久久久久久久| 在线精品福利免费播放| 国产精品扒开腿做爽爽爽视频| 宗合情欲网| 全球成人中文在线| 五十路熟女人妻一区二区在线观看| 岛国毛片在线观看免费| 99热18这里只有精品| 婷色五月| 日韩人妻制服丝袜av| 91在线/欧洲| 久久精品国产精品亚洲艾通辽熟妇 | 亚州再线| 91狠狠综合久久| 人妻性爱一区二区| 黄呦呦在线| 九九99久久| 国产毛片久久久久久久| 草草草视频| 麻豆国产原创AV色哟哟| 日本在线播放不卡一区| JIZZJIZZ亚洲女人被躁| 亚洲图片 激情小说| 色噜噜综合在线| AV一起草在线| 男人天堂新在线| 色婷婷婷五月天激情四射| 激情五月天婷婷| 强奸乱伦动态污图免费| 91香蕉视频在线观看免费| 白丝AV| 男人天堂新| 九草九九九| 青青操在线亚洲视频观看欧美在线 | 91性| 啊啊啊不要啊啊受不了了视频在线 | 97 亚洲 日韩 欧美 在线| 大香蕉黄色一区| 日本孕妇一区二区视频操逼免费看 | 玖草在线视频| 婷婷丁香人妻 | 欧美色97| 久久久无码精品人妻二区| 日本天堂网| 麻豆2区1区天美| 91美女丝袜诱惑视频| 91狠狠综合久久久| 在线v中文字幕一区二区三区| 亚欧性爱无码| 天天干干天天干干| 亚洲 日本 国产 综合| 翔田千里无码中出中文字幕| 亚洲乱色熟女一区| 亚洲色图欧美色图日韩色图| 377p欧洲日本亚洲大胆| 小视频玖玖| 亚洲国产蜜臀系列在线观看| 日韩欧美丝袜诱惑| 国产中文福利| 人妻在线中出视频| 嗯嗯啊啊视频一区二区三区| 日日嗨AV一区二区夜夜| 国产精品高朝久久久久久久| 欧美色爱综合| 欧美亚洲色的图| 亚洲AV色图| 999色欧美中文字幕| 夜夜嗨视频| 日小BB小视频| 国产精品宅男免费| 91蜜桃婷婷狠狠久久综合9色| 欧美国产日韩清纯唯美| 曰本精品久久久| 超碰日韩美妻| 性夜影院爽黄A爽免费动漫| 午夜精品久久久久久久久久蜜桃| 婷婷五月av| 婷婷久久综合| 91 亚洲情侣偷拍 久久| 中文字幕乱码在线观看| 一区二区三区亚洲| 天天日B夜夜干B时时操B| 一色网男人的天堂| 91真人天天在线| 这里只有精品97| 国产综合在线视频网站| 国产精品自拍xxxx| 神马久久久久眼| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 99国产人成精品| 超碰98综合网| 久久精品操| 欧美性爱无码一区二区三区| 在线观看日韩av不卡| 青青草视频久久久久| 国产乱子伦一区二区三区免看| 久久97超碰| 日韩在线观看中文字幕视频| 精品然女一区二区| 欧美性性性| 人妻系列无码专区中文有码| 日本熟妇熟色97一本在线观看| 欧美日韩青操| 日韩一区二区精彩视频| 中文字幕 码 自拍 视频 区| 超碰1024久久| 另类av天堂| 亚洲精品久久久久毛片A片拉屎| 日韩人妻有码免费视频| 麻豆精品久久久久久久| 一区二区三区男人的天堂| 色五月激情AV在线| 亚洲国产麻豆一区二区三区| 亚洲国产剧情少妇激情| 欧美中文综合| 另类小说综合网| 亚洲 日韩 欧美 国产综合体| 91嫩草欧美| 91伊人久| 青青草乱入乱欲视频在线观看| 国产精品永久免费10000| 欧美中文字幕一区 | 欲综合网| 国产小u女在线观看| 亚洲AV色图一区| 久久久成人免费av电影| 欧美色性爱| 亚洲女人毛茸茸91| 黄aaaaaaaaaaaaaaaaaa色网站| 中文字幕av一区二区三区人妻少妇 | 上床不卡网站| 婷婷去俺也去六月色| 色老久久| 亚洲色婷婷| 久久久日本电影| 亚洲综合另类欧美久久久| 俄罗斯一区二区视频在线观看| 亚洲黄日韩无码专区| 婷婷丁香五月天综合东京热| 床戏久久久av一区二区麻豆| 草草影院在线视频| 100啪啪视频大全| 日本免费一区二区不卡| 无码伊人久久大杳蕉中文无码| 欧姜老司机| 欧美大香蕉97| 欧美色图色综合| 亚洲成人妻日韩在线| 国产日逼视频| 久久久极品| 一道本东京热加勒比一区二区三区| 国产日韩欧美操逼视频| 91熟女视频网| 九九色色| 日本一区二区三区四区免费观看| 九九热精品视频六| 日本不卡二区| 懂色av中文字幕一区二区三区天美| 女人双腿搬开让男人桶| 欧美AB在线| 91久久久视| 成人午夜视频免费播放| 国产乱伦亚洲| 97超碰色色| 国产乱不卡| 久久AV色| 精品久久在线区一区| 99无码精品| 内射小黄片| 传媒免费一区二区三区| 亚洲黄片免费在线播放| 91蜜桃传媒精品久久久一区二区| 中日韩久久人妻一区二区| 国产男人又猛又粗又爽| 午夜福利无毒不卡| 亚洲国产精品无码AV久久| 丝袜视频网国产90| 欧美后入视频| 五月婷婷hd| 老鸭窝亚洲毛片| 亚洲天堂另类美腿| 婷婷五月天社区| 亚洲天堂,男人| 中文字幕成人| 人人扣人人操| 黄色网址在线免费观看| 国产女人操逼视频| 涩涩涩综合| 国产精品无码久久久久2025| 97 色综合| 香港久久久| 国产在线激情| 91欧美经典| 蜜臀中文字幕| 69国产对白刺激| 久久精品国产Aⅴ| 高清国产精品福利网站| 少妇熟女一区二区三区| 青草地一本线一区二区三区| 91狠狠狠| 曰本特级特黄特色黄色A级网站高清在线免费看 | 国产51色综合久久免费| 密乳无码| 噜噜吧,噜噜色,噜噜| 99热国产| 韩国女主播青草福利视频| 欧美se亚洲| 欧美精品久久| 熟妇女伦乱视频| 日本伦乱九九九综合| 小日子操bb在线看| 一区二区三区四区免费视频| 日本午夜久久电影| 殴美性色a级欧美| 美女毛片999| 日本一卡二区在线| 黄色香蕉视频网站一区| 郑州宾馆老熟女露脸啪啪| 97精品综合久久| 夜夜狼人妻| 国产精品一区在线播放| 青娱乐休闲视频在线观看| 约操熟妇| 欧洲天天在线| 少妇色综合| 白丝一区| 综合伊人激情| 无码抄逼网| 淫乱图区| 酒色综合网| 成人国产精品三级A片| 精品v1区| 日本在线伊人啪啪| 日本免费一级AAA大片器| 婷婷导航| 麻豆 亚洲 97| 亚洲中字幕日本一区二区三区| 午夜福利一区二区影院| 99精品网| 亚洲视频二区| 在线观看亚洲成人精品| 青青11操操操操操操操操| 后入式999| 一区二区三区亚洲| 亚洲熟妇极品| 欧美乱欲| 亚洲欧洲综合视频在线| 国产AB视频| 91在线超高颜值国产| 日韩成人色图| wuyechaopeng| 性色av网站| 天天综合网入口~91| 国产福利视频精品视频| 熟女在线视频| 日韩免费a级毛片无码a∨| www老逼91| dy888午夜老子影视达达兔| 九月丁香| 啊啊啊啊好多水| 日本久久久久久久久| 亚洲欧美另类图片| 性色一线| 人人模人人看| 性欧美体内射精| 国产亚洲女v在线观看| 欧美少妇内射| 亚洲精品毛片在线观看| 天美一区在线| 新版天堂中文资源8在线| 青青草原成人| 五月天色综合| 久久久久97| 中文字幕视频一区视频二区| 欧洲在线性爱视频| 美女的肌被草喷水视频| 中文字幕精品一区二区精| 白丝jkav| 国产精品久久久久久久久AV大片| 99re这里只有| 精品射1999| 可以在线观看AV的网站| 天天综合网~91| 久久精品免费| 婷婷超| 天海翼久久| 国产av美女被艹的乱叫| 性欧美91| 色九九九综合| 欧美精品999| 成人一道本免费视频| 欧美传媒一区| 日本91白丝| 北约熟女超碰| 欧美小说区视频区| 神马午夜久久久| 天天色天天干天天爱| 99日视频在线免费| 欧美一二三区四五区| 久久仑合| 韩三级a视频在线观看| AV色图|