免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

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

C++模板分離編譯困境:從編譯鏈接原理到工程解決方案 1. 項(xiàng)目概述從“黑盒”到“白盒”拆解C模板的編譯之謎剛接觸C模板那會(huì)兒我總覺得它像個(gè)“黑盒魔法”。你寫個(gè)templatetypename T T max(T a, T b)編譯器就能變出int max(int, int)、double max(double, double)甚至是你自定義的MyClass max(MyClass, MyClass)。這功能強(qiáng)大得讓人著迷但隨之而來的一個(gè)經(jīng)典問題也困擾了無數(shù)開發(fā)者包括當(dāng)年的我為什么模板不能像普通函數(shù)那樣把聲明放在.h頭文件定義放在.cpp源文件實(shí)現(xiàn)所謂的“分離編譯”編譯器報(bào)出的那些“未定義的引用”或“無法解析的外部符號(hào)”錯(cuò)誤常常讓人一頭霧水。這個(gè)問題遠(yuǎn)不止是記住“模板定義必須放在頭文件里”這條規(guī)則那么簡單。它直指C編譯和鏈接機(jī)制的核心是理解這門語言底層運(yùn)作原理的絕佳切入點(diǎn)。今天我們就拋開那些籠統(tǒng)的說法深入編譯器與鏈接器的“腹地”從模板實(shí)例化的完整生命周期出發(fā)結(jié)合編譯鏈接原理徹底搞明白模板為何與分離編譯“格格不入”。無論你是正在被大型模板項(xiàng)目編譯問題折磨的中級(jí)開發(fā)者還是希望夯實(shí)C基礎(chǔ)、理解語言設(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)你寫下templatetypename T class Vector { ... };時(shí)編譯器并不會(huì)為這個(gè)VectorT生成任何實(shí)際的機(jī)器代碼。它只是將這段模板定義存儲(chǔ)起來記住有這么一個(gè)“模具”存在。這個(gè)過程發(fā)生在編譯的早期階段。編譯器如GCC的cc1plus或Clang的clang前端對(duì)源代碼進(jìn)行詞法分析、語法分析當(dāng)遇到模板定義時(shí)它會(huì)進(jìn)行模板解析。解析器會(huì)檢查模板語法的正確性但不會(huì)進(jìn)行類型檢查因?yàn)轭愋蚑未知也不會(huì)生成任何與特定類型相關(guān)的中間代碼。模板定義中的代碼對(duì)于編譯器來說更像是一段待處理的“元程序”。2.2 實(shí)例化藍(lán)圖變實(shí)體的關(guān)鍵時(shí)刻實(shí)例化就是拿著具體的類型參數(shù)如int,std::string去套用那份藍(lán)圖生成一份實(shí)實(shí)在在的、可被編譯成機(jī)器代碼的函數(shù)或類定義的過程。生成的這個(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)行語法和語義檢查比如int類型是否支持操作并最終生成對(duì)應(yīng)的機(jī)器指令。關(guān)鍵理解實(shí)例化是一個(gè)“編譯期行為”它發(fā)生在編譯器處理單個(gè)翻譯單元通常是一個(gè).cpp文件及其所包含的所有頭文件的過程中。編譯器不會(huì)跨翻譯單元去“猜測(cè)”或“尋找”模板定義。2.3 實(shí)例化的兩種方式隱式與顯式隱式實(shí)例化是我們最常遇到的方式即編譯器在遇到模板使用時(shí)自動(dòng)觸發(fā)如上例所示。這是最方便但也最容易導(dǎo)致困惑的方式因?yàn)閷?shí)例化的時(shí)機(jī)和地點(diǎn)對(duì)開發(fā)者是透明的。顯式實(shí)例化則給了開發(fā)者控制權(quán)。你可以明確告訴編譯器“請(qǐng)?jiān)诖颂帪樘囟ǖ念愋蜕赡0鍖?shí)體。” 語法如下// 在某個(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í)例化是解決某些特定編譯問題如減少編譯時(shí)間、控制符號(hào)可見性的重要手段也是我們后續(xù)探討解決方案時(shí)的關(guān)鍵工具。3. 編譯與鏈接原理精講要理解模板的困境必須切換到編譯器和鏈接器的視角。讓我們簡要回顧一下C/C程序的構(gòu)建過程它主要分為編譯和鏈接兩大階段。3.1 編譯階段翻譯單元的獨(dú)立王國編譯器的基本工作單元是翻譯單元。一個(gè)翻譯單元通常由一個(gè).cpp源文件及其通過#include遞歸展開的所有頭文件內(nèi)容構(gòu)成。編譯器對(duì)每個(gè)翻譯單元進(jìn)行獨(dú)立處理彼此之間毫不知情。在編譯階段編譯器主要完成以下工作預(yù)處理處理#include,#define,#ifdef等指令生成一個(gè)龐大的、純粹的文本文件。詞法與語法分析將源代碼文本轉(zhuǎn)換為抽象語法樹。語義分析進(jìn)行類型檢查、名字查找等。對(duì)于模板此時(shí)只進(jìn)行非依賴名稱的查找和檢查依賴名稱指依賴于模板參數(shù)的名稱它們的查找要推遲到實(shí)例化時(shí)。生成中間代碼/匯編代碼將高級(jí)語言轉(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ù)問題的核心。一個(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ì)被寫入目標(biāo)文件的符號(hào)表并標(biāo)記為“已定義”。弱符號(hào)/未定義符號(hào)在本翻譯單元只聲明了但沒定義的符號(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開發(fā)人員命令提示符來查看目標(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í)行文件或庫中的確切地址。它會(huì)修改所有目標(biāo)文件中那些引用外部符號(hào)的指令將這些引用指向正確的內(nèi)存地址然后將所有代碼和數(shù)據(jù)段合并生成最終的可執(zhí)行文件或動(dòng)態(tài)庫。這個(gè)“一個(gè)定義規(guī)則”是保證程序確定性的基石。鏈接器的工作是機(jī)械的、基于已生成二進(jìn)制文件的它不具備編譯能力更不可能去理解C模板語法。4. 模板分離編譯困境的根源剖析現(xiàn)在讓我們把模板實(shí)例化和編譯鏈接原理結(jié)合起來模擬一個(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; }讓我們一步步拆解編譯和鏈接過程步驟一編譯mymath.cpp編譯器處理這個(gè)翻譯單元。它看到了add模板的完整定義。但是在整個(gè)mymath.cpp文件中沒有任何一行代碼使用add模板沒有addint或adddouble這樣的表達(dá)式。因此編譯器沒有觸發(fā)任何實(shí)例化。它只是把模板定義作為“藍(lán)圖”存儲(chǔ)在自己的上下文里然后生成的目標(biāo)文件mymath.obj中不會(huì)包含addint或任何其他特化的函數(shù)二進(jìn)制代碼。add模板本身不是一個(gè)可鏈接的符號(hào)所以符號(hào)表中也沒有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。它開始嘗試實(shí)例化。但是在當(dāng)前翻譯單元內(nèi)它找不到add模板的函數(shù)體定義聲明只告訴編譯器“有這么一個(gè)模板”但定義函數(shù)體才是生成代碼的配方。編譯器無法憑空生成addint的代碼。這時(shí)現(xiàn)代編譯器如GCC/Clang會(huì)怎么做它們會(huì)假設(shè)“也許這個(gè)模板的定義在別的翻譯單元里并且會(huì)在那里被實(shí)例化。” 于是編譯器在main.obj的符號(hào)表中為addint生成一個(gè)未定義的引用‘U’狀態(tài)然后繼續(xù)編譯把問題留給鏈接器。步驟三鏈接鏈接器開始工作。它拿到main.obj和mymath.obj。main.obj說“我需要一個(gè)叫addint的函數(shù)但我這里沒有它的代碼未定義?!?鏈接器去mymath.obj里找。mymath.obj里有什么它只有add模板的藍(lán)圖信息這在目標(biāo)文件里通常不以可鏈接符號(hào)的形式存在但沒有addint這個(gè)具體函數(shù)的二進(jìn)制代碼。因?yàn)閙ymath.cpp在編譯時(shí)根本沒有實(shí)例化它。因此鏈接器在mymath.obj里也找不到addint的強(qiáng)符號(hào)定義。結(jié)果就是鏈接錯(cuò)誤undefined reference toaddint(int, int)。核心矛盾總結(jié)實(shí)例化的觸發(fā)依賴于使用編譯器只在看到模板被具體使用的代碼行時(shí)才會(huì)嘗試實(shí)例化。實(shí)例化需要完整的定義實(shí)例化過程必須訪問模板的函數(shù)體或類體。編譯單元的獨(dú)立性編譯器處理單個(gè).cpp文件時(shí)看不到其他.cpp文件的內(nèi)容。鏈接器的局限性鏈接器只處理已編譯好的二進(jìn)制符號(hào)不具備編譯能力無法根據(jù)模板藍(lán)圖生成新的代碼。在分離編譯的場(chǎng)景下main.cpp需要addint的定義來實(shí)例化但定義在mymath.cpp里編譯器處理main.cpp時(shí)看不到。mymath.cpp擁有定義但因?yàn)闆]有使用而不實(shí)例化。鏈接器面對(duì)的是兩個(gè)都沒有addint代碼的目標(biāo)文件失敗是必然的。5. 工程實(shí)踐中的解決方案與權(quán)衡理解了問題根源解決方案就清晰了我們必須確保在編譯器處理某個(gè)翻譯單元時(shí)在模板被使用的代碼點(diǎn)編譯器能夠同時(shí)看到該模板的完整定義。以下是幾種常見的工程實(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)簡單直觀符合大多數(shù)開發(fā)者的直覺。通用性強(qiáng)適用于所有類型的模板和所有使用場(chǎng)景。缺點(diǎn)編譯依賴增加任何使用了該模板的源文件一旦模板頭文件有改動(dòng)所有包含它的源文件都需要重新編譯。在大型項(xiàng)目中這可能導(dǎo)致漫長的編譯時(shí)間。暴露實(shí)現(xiàn)細(xì)節(jié)模板的內(nèi)部實(shí)現(xiàn)完全暴露給了用戶不符合信息隱藏的原則??赡茉斐纱a膨脹同一個(gè)模板在不同翻譯單元被實(shí)例化相同類型時(shí)理論上每個(gè)單元都會(huì)生成一份代碼雖然鏈接器最終會(huì)去重通過“COMDAT”節(jié)但仍會(huì)增加編譯器前端的處理負(fù)擔(dān)。5.2 顯式實(shí)例化模式權(quán)衡下的控制當(dāng)模板可能使用的類型集合有限且已知時(shí)例如一個(gè)數(shù)學(xué)庫只支持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中沒有顯式實(shí)例化addfloat return 0; }工作原理mymath.cpp包含了模板定義并通過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è)類型。如果需要新的類型必須修改庫代碼添加新的顯式實(shí)例化行并重新編譯庫。這對(duì)于通用庫來說是致命的。維護(hù)負(fù)擔(dān)需要手動(dòng)管理實(shí)例化列表容易遺漏。注意事項(xiàng)使用“extern template”聲明為了優(yōu)化編譯時(shí)間即使在包含模式下也可以在頭文件中使用extern template來阻止某些廣泛使用的特化在多個(gè)翻譯單元中重復(fù)實(shí)例化。// mymath.hpp templatetypename T T add(T a, T b) { ... } // 告訴所有包含此頭文件的編譯單元“addint和adddouble已經(jīng)在某個(gè)專門的.cpp里實(shí)例化了你們別自己實(shí)例化?!?extern template int addint(int, int); extern template double adddouble(double, double); // 在某個(gè)專門的 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未來的終極解決方案C20引入了模塊Modules旨在從根本上解決頭文件包含機(jī)制帶來的諸多問題其中就包括模板分離編譯。// mymath.ixx (MSVC) 或 mymath.cppm (Clang/GCC草案) export module MyMath; // 聲明一個(gè)模塊 export templatetypename T // export 表示這個(gè)模板接口對(duì)導(dǎo)入者可見 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í)編譯器擁有足夠的信息從模塊接口中來生成代碼而無需訪問原始的模板定義源代碼。這既實(shí)現(xiàn)了邏輯上的分離用戶看不到實(shí)現(xiàn)又保證了編譯期的實(shí)例化能力。優(yōu)點(diǎn)真正的邏輯分離接口干凈。編譯速度革命性提升頭文件重復(fù)解析成為歷史。完美解決模板分離編譯問題。缺點(diǎn)編譯器支持仍在完善中不同編譯器MSVC, Clang, GCC的實(shí)現(xiàn)進(jìn)度和細(xì)節(jié)有差異。構(gòu)建系統(tǒng)需要升級(jí)如CMake舊項(xiàng)目遷移有成本。生態(tài)適配需要時(shí)間。6. 常見問題與深度排查指南在實(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說明符是否在聲明和定義處完全一致。一個(gè)templatetypename T void foo(T)和templatetypename U void foo(U)會(huì)被編譯器視為兩個(gè)不同的模板。特化問題如果你為特定類型提供了全特化template void fooint(int)確保全特化的定義對(duì)使用它的編譯單元可見。全特化是一個(gè)普通的函數(shù)/類它遵循ODR一個(gè)定義規(guī)則通常需要放在頭文件里除非使用顯式實(shí)例化模式。私有成員訪問如果模板定義中訪問了類的私有成員而該模板在類外部定義如類外定義的成員函數(shù)模板或友元模板需要仔細(xì)檢查友元聲明和訪問權(quán)限。編譯器擴(kuò)展或Bug極少情況下可能是編譯器問題。嘗試簡化代碼到一個(gè)最小復(fù)現(xiàn)樣例并檢查不同編譯器版本的表現(xiàn)。6.2 錯(cuò)誤在多個(gè)翻譯單元中重復(fù)定義場(chǎng)景使用包含模式鏈接時(shí)報(bào)告“multiple definition ofxxxint”??赡茉蜻@通常不是模板本身的問題。模板函數(shù)在多個(gè)單元實(shí)例化相同類型生成的符號(hào)通常是“弱符號(hào)”或“COMDAT”節(jié)鏈接器會(huì)正確去重。這個(gè)錯(cuò)誤更可能出現(xiàn)在你在頭文件里定義了一個(gè)非模板的普通函數(shù)或全局變量沒有static或inline修飾。這違反了ODR。你為模板提供了全特化并將這個(gè)全特化的定義放在了頭文件里但它沒有被聲明為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ǔ)模板庫如某個(gè)項(xiàng)目內(nèi)部的數(shù)學(xué)工具庫采用顯式實(shí)例化模式將其編譯成靜態(tài)庫.a/.lib。其他項(xiàng)目只需鏈接庫和包含聲明頭文件無需在每次編譯時(shí)處理模板定義。利用“extern template”進(jìn)行編譯防火墻如前所述在公共頭文件中用extern template聲明常用特化在一個(gè)單獨(dú)的源文件中集中實(shí)例化它們。這能有效阻止模板代碼在數(shù)十個(gè)甚至上百個(gè)源文件中重復(fù)編譯。使用預(yù)編譯頭PCH將包含大量模板代碼的穩(wěn)定頭文件如標(biāo)準(zhǔn)庫頭文件、第三方庫頭文件放入預(yù)編譯頭。編譯器只需解析和編譯它們一次后續(xù)編譯直接加載結(jié)果能極大提升編譯速度。這是大型項(xiàng)目如游戲引擎的標(biāo)配。依賴管理工具使用如ccache或sccache等編譯緩存工具當(dāng)源文件未改變時(shí)直接使用之前的編譯結(jié)果。6.4 模板與動(dòng)態(tài)庫DLL/SO的交互將模板代碼放入動(dòng)態(tài)庫是一個(gè)更復(fù)雜的話題。核心矛盾在于動(dòng)態(tài)庫在編譯時(shí)就需要確定導(dǎo)出哪些符號(hào)而模板的實(shí)例化是延遲的、依賴于使用者的?;静呗燥@式實(shí)例化并導(dǎo)出在動(dòng)態(tài)庫項(xiàng)目中使用顯式實(shí)例化模式并標(biāo)記需要導(dǎo)出的特化符號(hào)如Windows的__declspec(dllexport)GCC/Clang的默認(rèn)可見性控制或__attribute__((visibility(default)))。庫的使用者只能使用這些導(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)庫內(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)制邊界問題兼容性最好。理解模板無法分離編譯的根源不僅是為了解決一個(gè)編譯錯(cuò)誤更是為了深入理解C的編譯模型和語言設(shè)計(jì)哲學(xué)。它迫使我們?nèi)ニ伎冀涌谂c實(shí)現(xiàn)的邊界、編譯期與運(yùn)行期的分工、以及如何組織大型項(xiàng)目的代碼結(jié)構(gòu)。從包含模式到顯式實(shí)例化再到未來的模塊每一種方案都是在不同約束靈活性、編譯速度、封裝性下的權(quán)衡。掌握這些知識(shí)能讓你在遇到相關(guān)問題時(shí)不再盲目嘗試而是能夠精準(zhǔn)分析選擇最適合當(dāng)前項(xiàng)目的策略。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久综合九九| 超碰2021| AV色婷婷| 五月天伊人综合| 亚洲av网站在线观看| 久久黄色免费视频| 五月天啪啪视频| 色五月激情五月| 五月激情综| 超碰在线免费9| 五月天社区| 天天色宗合| 人妻AV在线| 丁香五月婷婷影视先锋| 202丰满熟女妇大| 蜜桃人妻无码AV天堂三区| 亚洲国产精品五月天| 五月天久久小说| 日日干天天爽| 伊人丁香五月| 99热99ai| 五月花综合网| 午夜理论片最新午夜理论剧| 伊人久久99| www.夜夜爱.com| 久久综合人妻| 五月天激情图片| 婷婷成人五月天| 夜夜做夜夜愛| 97在线精品视频| 欧美色图片88| Aaa久久| 超碰在线91| 五月婷婷在线免费| 久久精品人妻| 97色欧美| 综合色五月天| 国产另类综合| 五月婷AV| WWW.婷婷| 人人操插| 久色| 亚洲另类在线观看| A片试看50分钟做受视频| 色婷婷综合网站| 狠狠摸狠狠摸| 99热日韩| 午夜色婷婷| 日本美女上人| 五月丁香综合| 色天使久久综合| 天天干人人奸97| 屁股翘好撅高迎合跪趴| 精品9久| 老美AA片| 丁香五月婷婷99| 精品爆操| 大香蕉婷婷| 九色91视频| 色婷丁香| 色五月婷婷五月天| 夜色.cnm| 九九伊人网| 久久婷婷五月综合色奶水99啪| 99热在线观看99| 欧美婷婷九月| 久久婷婷亚洲| 好好干av| 在线网黄| 99热在线观看| 国产亚洲av片| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 久久婷五月天| 色综合99无码| 亚洲人妻Av| 婷婷综合视频| 五月天成人伊人| 天天干夜夜b| 色五月婷婷久久大| 久久xx| 色啪网| 激情文学综合婷婷五月天丁香花| 视频一二区| 六月婷婷色综合| 精品99久久久久成人网站免费| 日日操日日干| 99精品在线| 激情99| 五月天婷婷激情六月久久| 久碰久| 天天噜日日噜综合无码| 日本操片| 麻豆五月丁香婷婷| 五月叮香啪| 激情丁香五月| 在线色色| 色五月天综合网| 久热成人| 2013AV天堂| 久久久人妻久久久| 久9视频免费播放| 色丁香五月天婷婷| 亚洲另类电影| 亚洲黄色精品| 久久婷婷综合五月天| 精品人妻一区| 91色在线 | 日韩| 国产成人网址| 五月天久久婷婷| 免费视频这里只有精品| 欧美色五月| 九九在线91| 婷婷色五月激情| 丁香九月婷婷色| 欧美色五月| 婷婷丁香六月天| 婷婷综合五月| 午夜九九九九九九九九九九九九九| 六月丁香网| 欧美婷婷精品激| 六月色婷婷欧美| 婷婷色操| 超级黄色片| 五月天性色| 久久久8| 欧美影院| 午夜日韩久久久网站| 《战争与艾拉》完整版| 亚洲久久激情| 99热精品在线播放| 婷婷五月天成人网| 综合网色| 欧美色五月| 丁香视频| 99九九视频精彩在线| 亚洲狠9| 華人性愛AV在線| 色99色| 99久久久精品| 狠狠做婷婷| 97在线观视频免费观看| xxx综合在线| 99热6精品| 玖玖在线| 黄页大全十八禁| 96丁香六月婷婷蜜桃综合久久| 婷婷激情五月天小说| 五月开行婷婷色五月| 精品夜夜澡人妻无码AV| 日逼免费视频| 亚洲情欲久久| 五月亭亭狠狠| 久久久大香蕉| 99热97| 亚洲1区| 99激情网| 成人av免费观看| www.黄色片-久久成人国产精品在线播放-999AV | 色域五月婷婷丁香| 日本综合色图| 777精品成人a v久久| 成人做爰A片免费看视频| 亚洲春色奇米影视| 99精品大片| 丁香婷婷五月天成人| 狠狠五月激情婷婷直播片| 麻豆WWWCOM内射软件| 狠狠色狠狠鲁| WWW.久久久久久久久久久久久| 思思 热 99| 996热re视频在线观看视频| 特级片神马电影| 9九九久久精品无码专区| 色五月成人在线| 1024AV视频| 五月天综合激情网| 色五月琪琪| 91啪啪视频| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 无码少妇高潮喷水A片免费| 99视频精品视频| 国产精品99久久久久久久女警| 欧洲激情五月天婷婷| 久久综合99综合| 女人天堂 AV| 影音先锋天天日| 91九色|疯狂|高潮|对白|| 最新久久网址| 成人久碰| 国产激情久久久| 人人综合五月人人婷婷| 久久曰曰| 五月天婷婷影院| 任你爽免费视频| 色五月婷婷在线| 丁香六月婷婷综合啪啪| 六月婷婷深深爱| 99热传媒| 国产成人网址| www.久久爱.com| 久久这里面只有精品视频| 97人人操人人操人人操人人| 五月天婷婷基地| 狠狠色噜噜色狠狠狠综合久久成人波 | 五月丁香999| 91精品国产综合久久蜜芽解析速度| 久久草中文日韩欧美| 深爱丁香网| 99热99思午夜精品| 怎么样可以看免费的一级av| 狠狠狠狠狠狠狠狠| 婷婷五月婷婷| 天天操夜夜爽| 六月丁香成人| 五月天亚洲图片婷婷| 激情五月丁香五月色| 涩综合网| 激情六月婷婷| 激情五月天婷婷丁香| 婷婷欧美色| 射久久丁香五月| 欧美S码亚洲码精品M码| 99热免费观看| 丁香色五月 97干| 久色五月| 五月婷婷精品视频| 六月色婷婷欧美| 99久久视频| 一级AV片| 激情都市另类| 爽tv | 欧美日韩99| 天天日综合| 色婷婷色五月色丁香| 伊人激情综合网| 9色操| 激情图片亚洲| 婷婷五月天99综合网站| 色五月婷婷7777| 婷婷色导航| 中文激情网| 国内外色色色色色成人视频| 五月婷婷婷| 深爱激情久久| 人人看人人要| 九九精品网| 桃色激情网| 五月婷婷伊| 五月婷婷啪啪啪啪| 99玖玖人人| 丁香六月婷婷| 人妻久久久久久久 | 青青草六月丁香| 激情久久五月天| 九一娱乐在线观看视频| 人妻丰满精品一区二区A片| 99色色| 丁香五月综合在线| 欧美va亚洲va| 久久精品色| 怡红院91a√| 亚洲三A| 亭亭玉月丁香| 99色综合| 婷婷五月情| 久久 婷婷 五月天| 色五月婷婷在线| 女高怪谈在线观看| 五月丁香龟婷婷| 欧美久久五月婷婷| 丁香综合伊人| 久久五月天综合视频网站| 99狠狠操一| 99ri视频在线观看| 婷婷基地成人五月天| AA片在线观看视频在线播放| 欧美69久成人做爰视频| 99ER热精品视频| 欧美日韩aaa| 91婷婷色五月| 六月婷婷av| 九九热精品| 天天爽天天日天天舔| 日逼免费视频 | 久久性爱视频网站| 丁香六月婷婷| 公的粗大挺进了我的密道| 丁香五月电影| 五月婷婷开心网| 91九色视频| 2020日日干| 色综合天天综合成人网| 国产激情在线| 99ri视频| 91丨九色丨大屁股| 乱乱av| 色狠狠色噜噜AV天堂五区| 婷婷在线播放| 激情操逼婷婷| 久久天堂女人| 99色五月| 99热婷婷| 五月婷免费视频久久久| 天天天日天天天干| 五月婷婷之综合激情| 婷婷五月在线播放| 翔田千里 50岁 无码| 玖玖爱伊人| 99久.| 九九热av| 成人免费120分钟啪啪| 欧美成人AAA片一区国产精品 | 五月天婷婷丁香基地在线观看| 五月丁香六月婷婷综合网站| 激情五月天综合网| 丁香激情网| 激情六月婷婷| 久久月天堂| www.激情com| 99热在线观看精品| 情欲综合网| 99re这里只有精品在线观看| 激情综合99| 色综合丁香| 五月天激情小说| 大地9中文在线观看免费高清 | 中文字幕在线免费观看视频| 久草婷婷网 | 婷婷午夜丁香| 激情五月婷婷在线区| WWW.色婷婷.COM| 91婷婷五月天嫩女| 久久99网| 操逼综合网| 人人操人人操919999| 五月天激情综合在线| 人妻videos人妻高清| 欧美丁香婷婷五月天| 99热久草| 婷婷中文字幕网站| 久9视频| 丁香六月婷婷高清| 婷婷五月色色| www.色五月| 五月天婷婷久草丁香| 亚洲啪啪啪啪| 狠色色狠网| 九九热10| 亚洲无码性爱| 99re99热| 国产精品国产| 影音先锋一区| 懂色av粉嫩AV蜜臀AV| 99色中文| 天天综合社区| 国产AV一区二区三区最新精品 | 色啪综合| www色五月| 夜夜爽天天爽| 4399伦理午夜| 婷婷五月天综合色| 色九月婷婷| 欧美婷婷九月| 99热这里只是精品| 五月综合激情网| 9精品一区| 九月丁香婷婷综合激情| 色综合大香蕉| 奇米四色五月天| 亚洲小视频免费观看| 色婷婷丁香| 久青草影院| 久久久jd| 五月天天视频| 色情激情五月婷婷| 婷婷六月久久| 五月婷婷激情网| 激情六月天婷婷| 五月丁香激情六月| 9久热这里只有精品| 色情五月婷婷| 久久精品91视频| 99热这里有精品2| 99思思| 成人色图情色成人网 www.5b5b5bcom 五月天 | 婷婷五月天视| 亚洲色网络| 夜夜久久综合网| 五月花丁香婷婷| 色婷婷电影网| 五月天婷婷日日爱| 色婷婷婷婷| 色欲影香| 99在线免费视频| 婷婷性爱五月天丁香网| 天天天摸夜夜夜玩| 丁香婷婷欧美综合| 五月激情黄色小说| 婷婷色色网站| 就去涩涩丁香五月天| 激情综合网激情五月天| 狠狠做五月婷婷| 五月丁香六月激情欧美综合| 久久女婷| 丁香五月婷婷五月| 激情综合五月激情| 1000部毛片A片免费观看| 久久xxxx| 另类小说色婷婷| 九九热黄色| 在线观看的av| 欧美日韩91| Av大香蕉| 久久婷婷五月国产色综合激情| 超碰99在线观看| 色色色干| 九久9精品| 久久综合激情五月天| 99免费| 久久这里只有精品久久| av九九| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 亚洲成人免费电影| 少妇激情五月婷婷| 五月丁香综合中文| √天堂资源在线人妻熟女| 日韩99视频| 内射综合网| 五月丁香啪啪啪综合网| 伊人久久激情图区五月| 青草视频在线观看视频 | 丁香六月婷婷综合| 婷婷色色播五月天| Av在线不卡一区| 六月激情婷婷| 日韩啪啪网| 99精品视频网| 久久这里只有国产视频| 99偷拍视频在线日本| 77799热| 中文字幕在线免费看线人| 成人婷婷五月| 久re热视频| 日韩性视频| 激情五月天丁香| 久久丁香五月婷婷| 热成人网| 六月丁香色色| 国自产拍偷拍精品啪啪一区二区| 5月婷婷五月天| 色噜久| 成人av免费观看| 五月综合婷婷网| 超级碰碰碰久久网站| 综合XX网| 99re热| 婷婷五月另类网站| 婷婷五月天丁香花| 色五月天在线| 99ri在线观看视频| 婷婷.com| 色爱综合网| 99综合99| 九热...av| 日韩艹比| 五月综合久久| 婷婷五月天欧美图片在线播放电驴| 99久久久久| 天天婷婷色六月| 99色天堂| 第四色色六月色综合| 超碰chaompinm| 中文aV网| 成人片在线播放| 五月婷婷视频| 精品久久99码| 亚洲日日日| 色婷婷成人丁香| 婷婷丁香黄色| 少妇AB又爽又紧无码网站| 亚洲国产精品VA在线看黑人| 日操五月婷| 久久九九@| 怡红院AV亚洲一区二区三区H | 99在线免费视频播放| 欧美色色色色色| www.成人婷婷综合| 婷婷五月天另类视频| 大胆伊人久久| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 九色在线观看91av| 婷婷综合性爱网| 九九黄色网| 亚洲色99| 丁香婷婷在线| 色。 婷婷婷| 婷婷97碰碰| 影音先锋AV资源男人站| av性爱网站| 久久AAAA片一区二区| 5五月综合网亚洲| 99视频| 婷婷视频网| 丁香五月色| 日日肏天天操| 啪啪啪啪五月天| 狠狠色婷婷7777久| 99热1| 丁香婷婷综合喷| 亚洲亚洲人成综合网络| 激情综合五月婷婷| 99热啪啪| 天天橾日日橾夜夜橾17| 播五月婷婷开心| 欧美在线97| 2021日韩无码| 九九综合九色欧美狠狠| 五月丁香六月片| www.夜夜| 久草五月| 99国产精品久久久久久久久久久 | 色玖玖玖| 日本久久人| 999精品久久久久久久| 99热在线观看| 久久99热网| 99热超碰在线| 中文字幕无码人妻少妇免费视频 | 五月激情天| 夜夜撸日日操| 天天综合精品| 蜜臀AV在线观看| 99热| 婷婷五月丁香第四色超碰在线| 欧洲第一无人区观看| 久久五月天婷婷| 开心婷婷五月| 啪啪啪综合网| 强辱丰满人妻HD中文字幕| 激情五月婷婷| 九九操屄| 欧美超碰亚洲| 激情性爱五月| 黄网在线免费观看| 99久久99视频只有精品| 亚洲九九免费| 色色色.com| 91小黄书网址在线观看| 丁香六月婷婷综合啪啪| www久久艹| 99热亚洲| 九九热超碰| 麻豆AV一区二区三区| 欧美婷婷色| 五月婷婷激情在线| 91久久综合亚洲噜噜成人在线| jiujiujiuwuyuetian| 中文AV在线播放| 婷婷爱在线观看| 侠女刀之记忆电影在线看免费| 六月婷婷狠狠| 99热在线精品观看| 激情婷婷五月| 伊人综合网站| 久草婷婷视频| 超碰人人艹| sS丁香五月婷婷| 五月花婷婷最新| 五月丁香人妻| 偷拍五月丁香| 婷婷综合九色伊人| 久久久久久久久久91| 五月婷婷在线丁香| 天天成人综合视频| 噜噜狠狠色综合久| 六月丁香啪啪啪| 丁香六月婷婷激情| 婷婷五月天综合网| 夜夜夜叫天天天做| 9热在线观看| 99热最新网址| 综合超碰熟| 蜜臀丁香黄色婷婷五月天| 久久九九99字幕| 色五月激情五月| 五月激情小说网| 五月丁香色停停啪啪啪| 人妻AV在线观看| 激情婷婷五月天伊人在线观看| 综合色色色色色色| 久热大香蕉| 97香蕉人人在线观看| 色综合夜夜| 亚洲色模骚货| 日本婷婷| 婷婷五月天大香蕉| 六月婷伊人| 殴美日韩成人| 亚洲狠狠色丁香婷婷综合久久| 久久精品系列| 五月丁香婷婷伊人| 91九九| 欧美日韩色色| 国产色色网址网站| 91肏| 百度一下国产精品A| 裸体做A爰片毛片A片免费| 亚洲国产网址| 丁香五月婷婷成人综合| www..999热久| 99精品久久久久久久久| 激情99。| 99啪啪视频| 久婷狼色诱惑在线| 久久综合网免费视频| 久久九精品| 色一色综合| 婷婷五月小说色综合| 色五月婷婷色五月婷婷色五月婷婷| 九九热精品| 婷婷丁香五月91| 六月五月婷婷| 99久热| 色婷| 激情第四色| 九久九精品| 欧美色色色色色色色色色色影视| 色综合久久888| 我想看国产大学生口爆吞精的视频| 亚洲第一色网站| 99热碰碰热| 99久久終合| 26UUU精品一区二区c〇m| 婷婷六月啪啪| 丁香九月综合| 综合五月丁香六月婷婷| 人人操人人添人人摸97| 开心婷婷五月中文字幕组| 99热这里有精品| 五月婷婷xxx| 色久九| 六月大香蕉| 激情五月天激情五月天| 久久久久久久久久久jjjj| 五月丁香激情综合六月涩涩爱| 99色在线视频| 国产日批视频免费播放| 五月天成人综合| 97久久久| 五月丁香免费看| 激情五月丁香五月| www激情| 婷婷久久五月天| 五月香婷婷| 另类专区在线观看| 中文字幕在线日亚州9| 人人97碰| 五月激情偷拍| VA婷婷| 超碰在线人妻| 亚洲五月天综合| 中文字幕日产A片在线看| 亚洲丁香五月综合| 亚洲精品字幕| 思思久久青草热| 亚洲丁香婷婷| 亚洲另类视频| www.99精品在线| 99激情网| 久久综合激情五月天| 五月婷婷丁香| 思思久热| 91婷婷在线观看| 久久久精品AV| 99色在线视频观看| 午夜69成人做爰视频| 国产精品久久久60086| 五月婷婷电影院| 婷婷丁香人妻天天| 狠狠色丁香久久| 97在线精品| 天天色·欧美| 九月婷婷在线视频| 丁香五月婷婷网| 99操中文视频| 农村熟妇高潮精品A片| 欧美综合激情五月| 97在线干| 79精品视频在线观看,| 99热这只有| 色天使久久综合| 欧美激情五月天| 天天做天天爱天天搞| 香蕉AV777XXX色综合一区| 五月婷婷我| 97五月婷婷| 人妻啪啪啪| 九九热这里只有国产精品| 婷婷五月天丁香久久| 五月丁香久久网| 久久五月丁香伊人青草| 婷婷丁香五月在线观看91| 91日视频| 丁香五月激情月| 艹天天射| 最近中文字幕2019视频1| 亚洲aV写真天天综合网久久| 欧洲综合视频| 五月丁香六月片| 色婷婷五月天成人网| 亚洲激情99| 久久婷婷五| 婷婷综合网| 九九热精品6| 日本综合久久| 九九久久偷拍| 99这里有精品视频| 天天日本夜夜谢| 精品色情一区二区三区四区| 99热精品超碰| 日本不卡一区二区三区| 99在线视频精品| 欧美综合五月丁香六月婷| 九九热10| 超级碰 久久9| 免费精品99| 玖玖五月| 99re热免费观看视频精品| 亚洲超碰在线| 综合网网欲色| 在线中文AV| 国产免费一区二区在线A片视频| 99色在线观看视频| 欧美日本综合网| 九色在线观看91av| 激情涩播| www.天天干| 亚洲第一成人无码A片| 97色色色视频| 五月开心六月婷婷在线播放网站| 99热在线观看精品| 99热www| 99国产在线精品视频| 久久久中文| 五月丁香激情综合久久| 久热这里只有精品视频6| 久久激情视频| 天天日夜夜欢| 久久网婷婷| 色五月丁香A欧美com| 99热最新| 久久丁香| 综合色五月| 久久 天天| 欧美激情综合色综合| 翔田千里aV中文字幕| 人妻中文在线| 久久精品9| www.com亚洲网站在线免费| 碰99在线| 香蕉影院色| 日本精品人妻无码77777| 99在线免费视频| 日韩一级片| 久re热视频| 亚洲国产精品VA在线看黑人| 热99只有里视频| 婷婷综合网伊人| 日韩五月天婷婷| 色色五月丁香| 超级碰碰91| 狠狠的日| 五月开心久久| 丁香五月婷婷六月丁香| 强伦轩人妻一区二区电影| 99热777| 99热这里只有精品50| 99高级会所久久| 久这里只有精品| 狠狠五月激情在线| 久久视网36| 激情综合五月| 久久视这里只有精品| 亚洲综合在线视频| 91viP在线看| 久久丁香五月天| 91久操| 婷婷丁香社区网| 亭亭玉立国色天香| 五月色丁香综合| 五月激激网w'w'w| 久久只这里有精品| 天天看夜夜看| 婷婷色情六月| 这里只有精品久久| 97人妻碰碰碰久久香蕉| 少妇高潮一区二区三区99欧美| www.99色| 久久久久久人妻| 免费看欧美成人A片无码| 九九99九九精品免费| 丁香花大香蕉婷婷综合| 一级性感毛片| 另类激情五月| 蜜臀A∨在线水帘洞| 久久艹 五月天| 婷综合六月| 99碰网站| 激情 五月 婷婷 丁香| 五月天色官网| 色五月婷婷内射| 99热这里| 亚洲综合成人网| 综合色色五月| 精品99在线观看| 色五月婷婷中文字幕| 五月婷高清视频| 久热精品视频| 97视频91| 极品少妇高潮啪啪AV无码| 黄色片avv| 久久久jd| 日日色五月天| 五月丁香色六月激情干大屄| 婷婷伊人綜合中文字幕| www。久久久久一b。Cc| 97在线干| 亚洲婷婷丁香五月在线| 婷婷五月伦理| 丁香五月综合婷婷| 日本强伦片中文字幕免费看| 久人人操| 精品色情一区二区三区四区| 99er精品视频| 色婷婷久久| 欧美色激情四射| 狠狠色噜噜狠狠狠狠综合| 婷婷五月天激情综合| 丁香婷婷视频在线| 丁香五月性| 青青色com久久| 狠狠色丁香综合| 色婷婷综合视频| 久色| 99人人操| 婷婷激情六月综合| 干一干xxxx| 国产亚洲精品久久久久久久久动漫| 婷婷五月丁香香蕉| 激情五月婷婷网在线观看| 狠狠干在线| 疯狂做受XXXX高潮A片| 婷婷五月综合色中文字幕| 久这里只有精品| 天天爽天天| 日本不卡一区二区三区| 午夜成人网站在线观看| 日本激情五月天‘| 久热只有精品| 停停综合色色| 啪啪啪五月天| 99在线小视频| 久99精品视频| 五月婷婷深爱六月| 亚洲操b| 99玖玖人人| 高清无码中文字幕aVDV| 五月丁香啪啪| 激情中文在线| 婷婷五月深爱五月| 五月丁香六月婷| 六月丁香av| 丁婷婷五月天在线播放| 精品人妻午夜一区二区三区四区 | 夜夜夜夜夜操| 欧美日韩成人在线免费| 思思精品久久艹| 这里有精品| 婷久久| 99这里只有精品视频| 狠狠爱青青草| 99人这里只有精品| 大香蕉啪啪啪| 中文字幕九九九九| 99精品亚洲| httpwww色com日本| 亚洲狠狠婷婷综合久久久| 丁香五月天啪啪| 五月婷婷色影院| 狠狠狠色激情综合适合| 91久久九| 久久婷婷五月天激情唯美| 中字幕视频在线永久在线观看免费| 久久久com| 九色91视频| 久久九九精彩| 99re6久热只有精品6在线直播| 视频一区二区在线| 日日夜夜噜噜爽爽| 亚洲乱码日产精品BD| 思思视频这里是精品| 五月天播播| 婷婷五月天久久| 色婷婷综合亚洲| 天天综合久久| 婷丁香五月天| 久久超视频| 色爱综合网| 婷婷99狠狠躁天天躁中文| 丁香婷婷六月男男| 丁香六月激情综合网| 5月丁香婷婷激情网| www.色99| 99操碰| 久/久精品99看9| 亚洲精品成人| 久久久免费精彩视频| 国产韩日亚洲美州欧亚综合在线| 九九99在线免费在线观看视频| 五月伊人网| 99re思思热久久| 久久最新色色色| 欧美操人| 99视频在线观看视频| 九九亚洲天堂| 五月婷婷在线观看| 31色区视频免费看| 天天日夜夜拍| 激情五月丁香六月综合AVXXXX| 欧美色五月| 啪啪激情综合| 五月天激情国产综合婷婷婷| 丁香婷婷激情五月色| 国产亚洲成AV人片在线观黄桃| 五月丁综合在线观看| 九月丁香久久网| 五月激情婷婷在线| 久久婷婷丁香| 操一操干一干| 亚洲看av的网站| 碰久久精品w| 六月婷婷色色色| 丁香五月婷婷色| 第九色区av天堂| 色色综合视频| 色色综合激情| 丁香五月色情| oVV4WIB3vFi8D| 神马久久五月天| 欧美久久网| 激情美女五月天| 丁香婷婷老熟女综合网| 996er热| 九九碰九九爱97| 丁香五月花| 激情综合五月婷婷六月丁香| 97人人做| 无码AV免费精品一区二区三区| 99热国产在线| 五月综合激情| 免费观看欧美成人AA片爱我多深| 人人舔人人| www.婷婷六月天| 欧美搡BBBBB摔BBBBB| 五月婷婷六月综合| 97人人操人人爽| 激情文学综合婷婷五月天丁香花| 这里只有精品免费| 五月丁香手机在线| 亚洲无码影音| 色色激情网| www,色中色| 伊人9在线| 无码AV久久久久久久久| 色五月婷婷亚洲最大| 天天色情站| 操婷婷久久| 丁香五月激情网| 色偷偷色婷婷| 综合激情开心五月| 99碰在线视频| 精品一二三区久久AAA片| 五月丁香六月情| 丁香五月天激情五月天激情五月天激情网| www.99操.com| 婷婷五月天成人网| 很很干天天干| 婷婷色五月天第7色| 激情伊人网| 亚洲第一成人无码A片| 五月天伊人综合| 激情综合网激情五月欧美| 欧美日韩123| 亚洲区在线| 亚洲激情网| 夜夜撸夜夜骑| 久久婷婷操| 色噜噜综合网| 色婷婷色综合| 国外亚洲成AV人片在线观看| 久久色五月| 五月天基地| 亚洲婷婷丁香五月在线| 激情综合色婷婷啪啪六月天| 亚洲深喉aV| 综合激情视频| 噜一噜在线| 操啊操av| 亚洲久久视频| 黄网在线免费观看| 2013AV天堂| 精品一区久热| 欧美性做爰大片免费看办公室| 五月丁香婷草| 丁香六月情| 人妻操在线看| 77799热| 激情综合区| 丁香五月最新网址| 91碰免费视频| 欧美丰满熟妇BBB久久久| 色激情综合| 天天天在线观看| 亚洲色激情| 亚州日本欧州韩美高青高潮一| 六月99天天婷婷激情综合| 五月天伊人综合| 成人短视频免费| 婷婷丁香花五月天| 在线A色| 99无码免费视频| 成人看片网站| 另类伊人婷婷| 久9久成人精品视频| 五月丁香日逼| 五月婷婷激情在线| 久久色六月| 五月天色五月| 色色五月丁香| 九九aV| 色婷婷电影网| 九九热黄色| 色婷婷888| 99狠狠| 人人操Av| 五月天色狠狠| 六月婷婷网| 激情无码五月天| www久久99com| 91久热| 亚洲中文字幕网| 日本熟妇精品99| 久9热在线视频| 91九色国产| 大香蕉520| 性色人人爽| 熟女色专区| 深爱激情网五月| 五月综合视频在线| 99热 在线观看| 97激情五月天| 天天干天天操天天干天天操天天干天天操 | 欧美大道不卡| 国产精品视频免费看| 99啪| 这里只有精品在线视频精品| 色五月婷婷五月丁香五月激情五月视频 | 久9久9热久热| 久久xx| 26UUU成人网| 色婷婷综合五月| 开心五月激情五月丁香五月婷婷| 欧美成人精品老美女噜噜噜| 精品国产va久久久| 青青草成人网| 久久久精品AV| 丁香五月天啪啪| 丁香五月色| 国产精产国品一二三在观看| 99精品综合| 99视频在线观看视频| 亚洲色激情| 久久这里只有精彩| 五月丁香网站在线播放| 激情网五月婷婷| 99热精品在线在线| 五月丁香综合啪啪| CHINESE熟女老女人HD视频| 91蝌蚪窝视频在线| 六月激情网| 久久草大香蕉| 狠狠搞综合色| www.婷婷五月| 99操99| 人妻第九页| 久热伊人9| 天天开心天天色| 婷婷之六月丁香| 99视频这里有精品| 综合色播| 欧美日韩成人综合9| 久久综合色五月| 天天色·欧美| 亚洲色婷婷五月| 久久9精品| 天天色天天操天天射| caopeng97人人| .操區COm| 五月丁香六月婷婷在线观看| 综合婷婷| 久久女伦| 97视频久久| 久久婷婷欧美| WWW.99视频| 精品一二三区久久AAA片| 日韩精品99久久| 久久er这里只有精品| 五月婷婷之美女图片| 狠狠综合久久| 久热re视频在线观看网站| 噜噜噜狠狠色综| 婷婷色色网| 五月丁香婷婷在线| 久久久久久五月天| 婷婷黄色| 99色免费视频| 六月丁香五月天| 色婷婷亚洲综合天堂| 伊人网欧美在线男人天堂五月丁香| 夜夜做夜夜愛| 热久久精品视频网站| 色99网| 狠狠爱五月婷婷综合六月| 97人妻碰碰中文无码久热丝袜| 激情五月天www| 久热免费| 五月亭亭欧美女人| 亚洲激情丁香五月基地| 99热免费精品| 韩国不卡AC视频| 五月激情五月丁香| 国产精品色| 婷婷五月花.97| 噜噜噜噜婷婷五月天| 99综合视频| 无码视频国内精品久久久| 无码人妻激情| 五月综合婷婷五月| 98国产精品综合一区二区三区| 五月久久婷婷| 婷婷丁香五月激情| 影音先锋自拍网| 热的国产99热| 丁香五月婷婷AV| 午夜福利成人AV91| 天天干夜夜b| 婷婷五月花| www.91.com黄| 99亚洲视频| 婷婷狠狠青青| 色视五月天婷婷| 丁香婷婷啪啪| 五月婷婷AV| 超碰在线免费9| 久久久久五月丁香| 婷婷基地五月色| 日本一级一级一级一级| 狼友视频在线观看18| 99精彩视频| 91熟妇大香蕉| 六月婷婷国产| 成人美女网| 欧美精品久久久久久视频观看| 久久99综合| 五月色丁香| 99无码视频| 婷婷五月激情视频网| 另类小说婷婷色| 婷婷在线播放| 激情婷婷内射| 天天操综合网| 大香蕉av在线| 99熟女| 97超碰人人操| 99日本黄站| 男人天堂99| 丝袜激情网| 五月丁香色婷婷色| 色婷婷丁香五月| 狠狠色大香蕉| 天天干一干| 婷婷五月天亚洲综合| 天天日天天插| 亚洲婷婷婷| 色色激情五月| 欧美综合五月丁香六月婷| 久久婷婷91| 婷婷丁香激情综合色情| 欧洲综合视频| 五月激情视频| 久久九九免费视频| 99久久久国产大片区| 久久99精品视频| 夜夜躁狠狠 | 影音先锋噜一噜| 91人人爽狠狠狠| 成人日韩欧美| 丁香丁香激情网| 性无码专区无码| 亚洲男人的天堂婷婷色五月| 婷婷丁香熟女| 综合九九| 久久激情五月网| 亚洲区视频| 精品五月丁香| 亚洲亚洲人成综合网络| www.26uuu.com亚洲电影| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 伦99热| 婷婷伊人网| 噜噜色五月| 久久久天堂国产精品女人| 婷婷丁香色五月久久88| 久久九⑨| 激情综合区| 色波激情五月天| 成人免费黄色短视频| 亚洲第79页| 五月天伊人综合| 天天舔天天爽| 激情纯色婷婷五月天在线不卡视频| 婷婷免费视频| 99日本视频| 婷婷精品视频| 99er6| av网站免费在线| 日本爆乳片手机在线播放| 99热精品在线播放| 99re6在线视频精品免费| 日日艹思思热| 五月天伊人综合| 色爱综合网| 丁香五月天成人| 色99自拍| 内射人妻视频国内| 五月丁香淫淫婷婷婷| 五月色婷婷中文字幕| 亚洲精品又粗又大又爽A片| 丁香六月激情综合啪啪| 久久久久久97| 色色色网站| 这里只有精品免费 | 九月色婷婷综合| 99热99网| 青青操日本摸摸看看| 成人丁香五月| 九九色99| 丁香婷婷五月色成人网站| 被男人添B超爽视频| 亚洲天天操| 五月花综合网| 日本欧美999久久久三级片| 激情小说视频图片| 丁香5月婷婷| 久99热| Caoporn公开|