精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊C++陷阱與套路

開發(fā) 后端
C++是一門被廣泛使用的系統(tǒng)級編程語言,更是高性能后端標準開發(fā)語言;C++雖功能強大,靈活巧妙,但卻屬于易學難精的專家型語言,不僅新手難以駕馭,就是老司機也容易掉進各種陷阱。

[[335046]]

本文轉(zhuǎn)載自微信公眾號「碼磚雜役」,作者人民副首席碼仔 。轉(zhuǎn)載本文請聯(lián)系碼磚雜役公眾號。  

# 一、導語

C++是一門被廣泛使用的系統(tǒng)級編程語言,更是高性能后端標準開發(fā)語言;C++雖功能強大,靈活巧妙,但卻屬于易學難精的專家型語言,不僅新手難以駕馭,就是老司機也容易掉進各種陷阱。本文結(jié)合號主的工作經(jīng)驗和學習心得,對C++語言的一些高級特性,做了簡單介紹;對一些常見的誤解,做了解釋澄清;對比較容易犯錯的地方,做了歸納總結(jié);希望借此能增進大家對C++語言了解,減少編程出錯,提升工作效率。

# 二、陷阱

## 1.我的程序里用了全局變量,為何進程退出會莫名其妙的core掉?

Rule:C++在不同模塊(源文件)里定義的全局變量,不保證構(gòu)造順序;但保證在同一模塊(源文件)里定義的全局變量,按定義的先后順序構(gòu)造,按定義的相反次序析構(gòu)。

我們程序在a.cpp里定義了依次全局變量X和Y;

按照規(guī)則:X先構(gòu)造,Y后構(gòu)造;進程停止執(zhí)行的時候,Y先析構(gòu),X后析構(gòu);但如果X的析構(gòu)依賴于Y,那么core的事情就有可能發(fā)生。

**結(jié)論**:如果全局變量有依賴關系,那么就把它們放在同一個源文件定義,且按正確的順序定義,確保依賴關系正確,而不是定義在不同源文件;對于系統(tǒng)中的單件,單件依賴也要注意這個問題。

## 2.坑中坑:std::sort()

相信工作5年以上至少50%的C/C++程序員都被它坑過,我已經(jīng)聽到過了無數(shù)個悲傷的故事,《圣斗士星矢》,《仙劍》,還有別人家的項目《天天愛消除》,都有人掉坑,程序運行幾天莫名奇妙的Crash掉,一臉懵逼。

sort算法對比較函數(shù)有很強的約束,不能亂來,如果要用,要自己提供比較函數(shù)或者函數(shù)對象,一定搞清楚什么叫“嚴格弱排序”,一定要滿足以下3個特性:

1. 非自反性

2. 非對稱性

3. 傳遞性

盡量對索引或者指針sort,而不是針對對象本身,因為如果對象比較大,交換(復制)對象比交換指針或索引更耗費。

## 3.注意操作符短路

考慮游戲玩家回血回藍(魔法)刷新給客戶端的邏輯。玩家每3秒回一點血,玩家每5秒回一點藍,回藍回血共用一個協(xié)議通知客戶端,也就是說只要有回血或者回藍就要把新的血量和魔法值通知客戶端。

玩家的心跳函數(shù)heartbeat()在主邏輯線程被循環(huán)調(diào)用

  1. ```c++ 
  2. void  GamePlayer::Heartbeat() 
  3.     if (GenHP() || GenMP()) 
  4.     { 
  5.         NotifyClientHPMP(); 
  6.     } 
  7. ``` 

如果GenHP回血了,就返回true,否則false;不一定每次調(diào)用GenHP都會回血,取決于是否達到3秒間隔。

如果GenMP回藍了,就返回true,否則false;不一定每次調(diào)用GenMP都會回血,取決于是否達到5秒間隔。

實際運行發(fā)現(xiàn)回血回藍邏輯不對,Word麻,原來是操作符短路了,如果GenHP()返回true了,那GenMP()就不會被調(diào)用,就有可能失去回藍的機會。你需要修改程序如下:

  1. ```c++ 
  2. void GamePlayer::Heartbeat() 
  3.     bool hp = GenHP(); 
  4.     bool mp = GenMP(); 
  5.  
  6.     if (hp || mp) 
  7.     {   
  8.         NotifyClientHPMP(); 
  9.     }   
  10. ``` 

邏輯與(&&)跟邏輯或(||)有同樣的問題, if (a && b) 如果a的表達式求值為false,b表達式也不會被計算。

有時候,我們會寫出 if (ptr != nullptr && ptr->Do())這樣的代碼,這正是利用了操作符短路的語法特征。

## 4.別讓循環(huán)停不下來

  1. ```c++ 
  2. for (unsigned int i = 5; i >=0; --i) 
  3.     //... 
  4. ``` 

程序跑到這,WTF?根本停不下來啊?問題很簡單,unsigned永遠>=0,是不是心中一萬只馬奔騰?

解決這個問題很簡單,但是有時候這一類的錯誤卻沒這么明顯,你需要罩子放亮點。

## 5.當心越界

memcpy,memset有很強的限制,僅能用于POD結(jié)構(gòu),不能作用于stl容器或者帶有虛函數(shù)的類。

帶虛函數(shù)的類對象會有一個虛函數(shù)表的指針,memcpy將破壞該指針指向。

對非POD執(zhí)行memset/memcpy,免費送你四個字:**自求多福**

## 6.內(nèi)存重疊

內(nèi)存拷貝的時候,如果src和dst有重疊,需要用memmov替代memcpy。

## 7.理解user stack空間很有限

不能在棧上定義過大的臨時對象。一般而言,用戶棧只有幾兆(典型大小是4M,8M),所以棧上創(chuàng)建的對象不能太大。

## 8.用sprintf格式化字符串的時候,類型和符號要嚴格匹配

因為sprintf的函數(shù)實現(xiàn)里是按格式化串從棧上取參數(shù),任何不一致,都有可能引起不可預知的錯誤;/usr/include/inttypes.h里定義了跨平臺的格式化符號,比如PRId64用于格式化int64_t

## 9.用c標準庫的安全版本(帶n標識)替換非安全版本

比如用strncpy替代strcpy,用snprintf替代sprintf,用strncat代替strcat,用strncmp代替strcmp,memcpy(dst, src, n)要確保[dst,dst+n]和[src, src+n]都有有效的虛擬內(nèi)存地址空間。多線程環(huán)境下,要用系統(tǒng)調(diào)用或者庫函數(shù)的安全版本代替非安全版本(_r版本),謹記strtok,gmtime等標準c函數(shù)都不是線程安全的。

## STL容器的遍歷刪除要小心迭代器失效

vector,list,map,set等各有不同的寫法:

  1. vector,list,map,set等各有不同的寫法: 
  2. ```c++ 
  3. int main(int argc, char *argv[]) 
  4.     //vector遍歷刪除 
  5.     std::vector<int> v(8); 
  6.     std::generate(v.begin(), v.end(), std::rand); 
  7.     std::cout << "after vector generate...\n"
  8.     std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n")); 
  9.     for (auto x = v.begin(); x != v.end(); ) 
  10.     { 
  11.         if (*x % 2) 
  12.             x = v.erase(x); 
  13.         else 
  14.             ++x; 
  15.     } 
  16.  
  17.     std::cout << "after vector erase...\n"
  18.     std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n")); 
  19.  
  20.     //map遍歷刪除 
  21.     std::map<intint> m = {{1,2}, {8,4}, {5,6}, {6,7}}; 
  22.     for (auto x = m.begin(); x != m.end(); ) 
  23.     { 
  24.         if (x->first % 2) 
  25.             m.erase(x++); 
  26.         else 
  27.             ++x; 
  28.     } 
  29.     return 0; 
  30. ``` 

有時候遍歷刪除的邏輯不是這么明顯,可能循環(huán)里調(diào)了另一個函數(shù),而該函數(shù)在某種特定的情況下才會刪除當前元素,這樣的話,就是很長一段時間,程序都運行得好好的,而當你正跟別人談笑風生的時候,忽然crash,這就尷尬了。

圣斗士星矢項目曾經(jīng)遭遇過這個問題,基本規(guī)律是一個禮拜game server crash一次,折磨團隊將近一個月。

比較low的處理方式可以把待刪元素放到另一個容器WaitEraseContainer里保存下來,再走一趟單獨的循環(huán),刪除待刪元素。

當然,我們推薦在遍歷的同時刪除,因為這樣效率更高,也顯得行家里手。

# 三、性能

## 空間置換時間

通過空間換取時間是提高性能的慣用法,bitmap,int map[]這些慣用法要了然于胸。

## 減少拷貝 & COW

了解Copy On Write。

只要可能就應該減少拷貝,比如通過共享,比如通過引用指針的形式傳遞參數(shù)和返回值。

## 延遲計算和預計算

比如游戲服務器端玩家的戰(zhàn)力,由屬性a,b決定,也就是說屬性a,b任何一個變化,都需要重算戰(zhàn)力;但如果ModifyPropertyA(),ModifyPropertyB()之后,都重算戰(zhàn)力卻并非真正必要,因為修改屬性A之后有可能馬上修改B,兩次重算戰(zhàn)力,顯然第一次重算的結(jié)果會很快被第二次的重算覆蓋。

而且很多情況下,我們可能需要在心跳里,把最新的戰(zhàn)力值推送給客戶端,這樣的話,ModifyPropertyA(),ModifyPropertyB()里,我們其實只需要把戰(zhàn)力置臟,延遲計算,這樣就能避免不必要的計算。

在GetFightValue()里判斷FightValueDirtyFlag,如果臟,則重算,清臟標記;如果不臟,直接返回之前計算的結(jié)果。

預計算的思想類似。

## 分散計算

分散計算是把任務分散,打碎,避免一次大計算量,卡住程序。

## 哈希

減少字符串比較,構(gòu)建hash,可能會多費一點存儲空間,但收益可觀,值得一試。

## 日志節(jié)制

日志的開銷不容忽視,要分級,不要過于奔放,可以把日志作為debug手段,但要release干凈。

## 編譯器為什么不給局部變量和成員變量做默認初始化

因為效率,C++被設計為系統(tǒng)級的編程語言,效率是優(yōu)先考慮的方向,c++秉持的一個設計哲學是“不為不必要的操作付出任何額外的代價”。所以它有別于java,不給成員變量和局部變量做默認初始化,如果需要賦初值,那就由程序員自己去保證。

**結(jié)論**:從安全的角度出發(fā),不應使用未初始化的變量,定義變量的時候賦初值是一個好的習慣,很多錯誤皆因未正確初始化而起,C++11支持成員變量定義的時候直接初始化,成員變量盡量在成員初始化列表里初始化,且要按定義的順序初始化。

## 理解函數(shù)調(diào)用的性能開銷,性能敏感函數(shù)考慮inline

棧幀建立和銷毀,參數(shù)傳遞,控制轉(zhuǎn)移這些對性能有損。

X86_64體系結(jié)構(gòu)因為通用寄存器數(shù)目增加到16個,所以64位系統(tǒng)下參數(shù)數(shù)目不多的函數(shù)調(diào)用,將會由寄存器傳遞代替壓棧方式傳遞參數(shù),但棧幀建立、撤銷和控制轉(zhuǎn)移依然會對性能有所影響。

## 遞歸的優(yōu)點、缺點

優(yōu)點:方便編寫,容易理解。

缺點:運行速度變慢,所以需要預估好遞歸深度。

建議:優(yōu)先考慮非遞歸實現(xiàn)版本。遞歸函數(shù)要有退出條件且不能遞歸過深,不然有爆棧危險。

# 四、數(shù)據(jù)結(jié)構(gòu)和容器

## 了解std::vector的方方面面和底層實現(xiàn)

1. vector是動態(tài)擴容的,2的次方往上翻,為了確保數(shù)據(jù)保存在連續(xù)空間,每次擴充,會將原member悉數(shù)拷貝到新的內(nèi)存塊;不要保存vector內(nèi)對象的指針,擴容會導致其失效 ;可以通過保存其下標index替代。

2. 運行過程中需要動態(tài)增刪的vector,不宜存放大的對象本身 ,因為擴容會導致所有成員拷貝構(gòu)造,消耗較大,可以通過保存對象指針替代。

3. resize()是重置大小;reserve()是預留空間,并未改變size(),可避免多次擴容;clear()并不會導致空間收縮 ,如果需要釋放空間,可以跟空的vector交換,std::vector .swap(v),c++11里shrink_to_fit()也能收縮內(nèi)存。

4. 理解at()和operator[]的區(qū)別 :at()會做下標越界檢查,operator[]提供數(shù)組索引級的訪問,在release版本下不會檢查下標,VC會在Debug版本會檢查;c++標準規(guī)定:operator[]不提供下標安全性檢查。

5. C++標準規(guī)定了std::vector的底層用數(shù)組實現(xiàn),認清這一點并利用這一點。

## 常用數(shù)據(jù)結(jié)構(gòu)

**數(shù)組**:內(nèi)存連續(xù),隨機訪問,性能高,局部性好,不支持動態(tài)伸縮,最常用,通常也是最正確的選擇。

**鏈表**:動態(tài)伸縮,插入/脫離極快(特別是帶前后驅(qū)指針),節(jié)點內(nèi)存通常不連續(xù)(當然可以通過從固定內(nèi)存池分配規(guī)避),不支持隨機訪問。只在需要快速增刪、動態(tài)伸縮的有限場景下才被使用,比如游戲里面地圖劃分格子,每個格子維護一個玩家鏈表(格子進入玩家視野的時候需要遍歷該列表),玩家會在格子之間頻繁移動。

**查找**:3種:bst,hashtable,基于有序數(shù)組的bsearch。二叉搜索樹(RBTree),這個從begin到end有序,最壞查找速度logN,壞處內(nèi)存不連續(xù),節(jié)點有額外空間浪費;hashtable,好的hash函數(shù)不好選,搜索最壞退化成鏈表,難以估計捅數(shù)量,開大了浪費內(nèi)存,開小了增加沖突幾率,擴容會卡一下,無序;基于有序數(shù)組的bsearch,局部性好,insert/delete慢。

# 五、最佳實踐

## 對于在啟動時加載好,運行中不變化的查詢結(jié)構(gòu),可以考慮用sorted array替代map,hash表等

因為有序數(shù)組支持二分查找,效率跟map差不多。對于只需要在程序啟動的時候構(gòu)建(排序)一次的查詢結(jié)構(gòu),有序數(shù)組相比map和hash可能有更好的內(nèi)存命中性(局部命中性)。

運行過程中,穩(wěn)定的查詢結(jié)構(gòu)(比如配置表,需要根據(jù)id查找配置表項,運行過程中不增刪),有序數(shù)組是個不錯的選擇;如果不穩(wěn)定,則有序數(shù)組的插入刪除效率比map,hashtable差,所以選用有序數(shù)組需要注意適用場合。

## std::map or std::unorder_map?

想清楚他們的利弊,map是用紅黑樹做的,unorder_map底層是hash表做的,hash表相對于紅黑樹有更高的查找性能。hash表的效率取決于hash算法和沖突解決方法(一般是拉鏈法,hash桶),以及數(shù)據(jù)分布,如果負載因子高,就會降低命中率,為了提高命中率,就需要擴容,重新hash,而重新hash是很慢的,相當于卡一下。

而紅黑樹有更好的平均復雜度,所以如果數(shù)據(jù)量不是特別大,map是勝任的。

## 積極的使用const

理解const不僅僅是一種語法層面的保護機制,也會影響程序的編譯和運行。

const常量會被編碼到機器指令。

## 理解四種轉(zhuǎn)型的含義和區(qū)別

避免用錯,盡量少用向下轉(zhuǎn)型(可以通過設計加以改進)

static_cast, dynamic_cast,const_cast,reinterpret_cast,傻傻分不清?

C++磚家說:一句話,盡量少用轉(zhuǎn)型,強制類型轉(zhuǎn)換是C Style,如果你的C++代碼需要類型強轉(zhuǎn),你需要去考慮是否設計有問題。

## 理解字節(jié)對齊

字節(jié)對齊能讓存儲器訪問速度更快。

字節(jié)對齊跟cpu架構(gòu)相關,有些cpu訪問特定類型的數(shù)據(jù)必須在一定地址對齊的儲存器位置,否則會觸發(fā)異常。

字節(jié)對齊的另一個影響是調(diào)整結(jié)構(gòu)體成員變量的定義順序,有可能減少結(jié)構(gòu)體大小,這在某些情況下,能節(jié)省內(nèi)存。

## 牢記3 rules和5 rules,當然C++11又多了&&的copy ctor和op=版本

只在需要接管的時候才自定義operator=和copy constructor,如果編譯器提供的默認版本工作的很好,不要去自找麻煩,自定義的版本勿忘拷貝每一個成分,如果要接管就要處理好。

## 組合優(yōu)先于繼承,繼承是一種最強的類間關系

典型的適配器模式有類適配器和對象適配器,一般而言,建議用對象適配的方式,而非用基于繼承的類適配方式,比如STL中的queue/stack的實現(xiàn)就是基于對象適配。

## 減少依賴,注意隔離

+ 最大限度的減少文件間的依賴關系,用前向聲明拆解相互依賴。

+ 了解pimpl技術。

+ 頭文件要自給自足,不要圖省事all.h,不要包含不必要的頭文件,也不要把該包含的頭文件推給user去包含,一句話,頭文件包含要不多不少剛剛好。

## 嚴格配對(RAII)

打開的句柄要關閉,加鎖/解鎖,new/delete,new[]/delete[],malloc/free要配對,可以使用RAII技術防止資源泄露,編寫符合規(guī)范的代碼

Valgrind對程序的內(nèi)存使用方式有期望,需要干凈的釋放,所以規(guī)范編程才能寫出valgrind干凈的代碼,不然再好的工具碰到不按規(guī)劃寫的代碼也是武功盡廢啊。

## 理解多繼承潛在的問題,慎用多繼承

多繼承會存在菱形繼承的問題,多個基類有相同成員變量會有問題,需要謹慎對待。

## 有多態(tài)用法抽象基類的析構(gòu)函數(shù)要加virtual關鍵字

主要是為了基類的析構(gòu)函數(shù)能得到正確的調(diào)用。

virtual dtor跟普通虛函數(shù)一樣,基類指針指向子類對象的時候,delete ptr,根據(jù)虛函數(shù)特征,如果析構(gòu)函數(shù)是普通函數(shù),那么就調(diào)用ptr顯式(基類)類型的析構(gòu)函數(shù);如果析構(gòu)函數(shù)是virtual,則會調(diào)用子類的析構(gòu)函數(shù),然后再調(diào)用基類析構(gòu)函數(shù)。

## 避免在構(gòu)造函數(shù)和析構(gòu)函數(shù)里調(diào)用虛函數(shù)

構(gòu)造函數(shù)里,對象并沒有完全構(gòu)建好,此時調(diào)用虛函數(shù)不一定能正確綁定,析構(gòu)亦如此。

從輸入流獲取數(shù)據(jù),要做好數(shù)據(jù)不夠的處理,要加try catch;沒有被吞咽的exception,會被傳播

從網(wǎng)絡數(shù)據(jù)流讀取數(shù)據(jù),從數(shù)據(jù)庫恢復數(shù)據(jù)都需要注意這個問題。

## 協(xié)議盡量不要傳float,如果傳float要了解NaN的概念,要做好檢查,避免惡意傳播

可以考慮用整數(shù)替代浮點,比如萬分之五(5%%),就保存5。

## 定義宏要遵循常規(guī)

要對每個變量加括弧,有時候需要加do {} while(0)或者{},以便能將一條宏當成一個語句。要理解宏在預處理階段被替換,不用的時候要#undef,要防止污染別人的代碼,要避免宏定義中依賴特定外部變量名。

## 智能指針

理解基于引用計數(shù)法的智能指針實現(xiàn)方式,了解所有權(quán)轉(zhuǎn)移的概念,理解shared_ptr和unique_ptr的區(qū)別和適用場景。

不要誤用指針,指針帶來彈性,但如果沒有這個需要,就不要用(比如命名全局變量能搞定,非要整一個全局變量的指針,然后在init里new,在terminate里delete,自找麻煩)。

## 考慮用std::shared_ptr管理動態(tài)分配的對象。

指針能帶來彈性,但不要誤用,它的彈性指一方面它能在運行時改變指向,可以用來做多態(tài),另一方面對于不能固定大小的數(shù)組可以動態(tài)伸縮,但很多時候,我們對固定大小的array,也在init里new/malloc出來,其實沒必要,而且會多占用sizeof(void*)字節(jié),而且增加一層間接訪問。

## size_t到底是個什么?我該用有符號還是無符號整數(shù)?

size_t類型是被設計來保存系統(tǒng)存儲器上能保存的對象的最大個數(shù)。

32位系統(tǒng),一個對象最小的單位是一個字節(jié),那2的32次方內(nèi)存,最多能保存的對象數(shù)目就是4G/1字節(jié),正好一個unsigned int能保存下來(typedef unsigned int size_t)。

同樣,64位系統(tǒng),unsigned long是8字節(jié),所以size_t就是unsigned long的類型別名。

對于像索引,位置這樣的變量,是用有符號還是無符號呢?像money這樣的屬性呢?

一句話:要講道理,用最自然,最順理成章的類型。比如索引不可能為負用size_t,賬戶可能欠錢,則money用int。比如:

  1. ``` 
  2. template <class T> class vector 
  3.     T& operator(size_t index) {} 
  4. }; 
  5. ``` 

標準庫給出了最好的示范,因為如果是有符號的話,你需要這樣判斷

  1. if (index < 0 || index >= max_num) throw out_of_bound(); 

而如果是無符號整數(shù),你只需要判斷 if (index >= max_num),你認可嗎?

## 整型一般用int,long就很好,用short,char需要很仔細,要防止溢出

大多數(shù)情況下,用int,long就很好,long一般等于機器字長,long能直接放到寄存器,硬件處理起來速度也更快。

很多時候,我們希望用short,char(8位整型)達到減少結(jié)構(gòu)體大小的目的。但是由于字節(jié)對齊,可能并不能真正減少,而且1,2個字節(jié)的整型位數(shù)太少,一不小心就溢出了,需要特別注意。

所以,除非在db、網(wǎng)絡這些對存儲大小非常敏感的場合,我們才需要考慮是否以short,char替代int,long。

# 六、擴展

## 了解c++高階特性

模板和泛型編程,union,bitfield,指向成員的指針,placement new,顯式析構(gòu),異常機制,nested class,local class,namespace,多繼承、虛繼承,volatile,extern "C"等

有些高級特性只有在特定情況下才會被用到,但技多不壓身,平時還是需要積累和了解,這樣在需求出現(xiàn)時,才能從自己的知識庫里拿出工具來對付它。

## 了解C++新標準

關注新技術,c++11/14/17、lambda,右值引用,move語義,多線程庫等

c++98/03標準到c++11標準的推出歷經(jīng)13年,13年來程序設計語言的思想得到了很大的發(fā)展,c++11新標準吸收了很多其他語言的新特性,雖然c++11新標準主要是靠引入新的庫來支持新特征,核心語言的變化較少,但新標準還是引入了move語義等核心語法層面的修改,每個CPPer都應該了解新標準。

## OOD設計原則并不是胡扯

  • + 設計模式六大原則(1):單一職責原則
  • + 設計模式六大原則(2):里氏替換原則
  • + 設計模式六大原則(3):依賴倒置原則
  • + 設計模式六大原則(4):接口隔離原則
  • + 設計模式六大原則(5):迪米特法則
  • + 設計模式六大原則(6):開閉原則

## 熟悉常用設計模式,活學活用,不生搬硬套

 

神化設計模式和反設計模式,都不是科學的態(tài)度,設計模式是軟件設計的經(jīng)驗總結(jié),有一定的價值;GOF書上對每一個設計模式,都用專門的段落講它的應用場景和適用性,限制和缺陷,在正確評估得失的情況下,是鼓勵使用的,但顯然,你首先需要準確get到她。

 

責任編輯:武曉燕 來源: 碼磚雜役
相關推薦

2025-10-27 02:15:00

2011-05-24 16:58:52

CC++

2017-07-25 15:21:42

數(shù)據(jù)挖掘深度學習模型

2017-12-20 16:15:30

分布式系統(tǒng)架構(gòu)

2023-12-04 09:37:00

C++靜態(tài)變量

2022-02-17 08:48:12

C++開發(fā)單片機

2021-06-09 07:32:18

C++內(nèi)置函數(shù)函數(shù)傳參

2020-01-09 09:50:32

C++JavaPython

2018-01-23 15:55:23

分布式系統(tǒng)架構(gòu)

2022-07-26 00:36:06

C#C++函數(shù)

2021-06-16 07:56:48

C++新特性類型

2024-05-15 09:11:51

委托事件C#

2010-01-25 15:55:50

托管C++

2019-10-29 05:47:15

CC++Python

2024-12-11 12:00:00

C++拷貝

2023-12-04 18:31:59

C語言函數(shù)

2025-09-28 03:00:00

C++虛函數(shù)機制

2010-01-22 11:23:06

C++程序

2011-08-04 13:38:01

Objective-C C++

2017-08-14 16:12:56

面試套路原則
點贊
收藏

51CTO技術棧公眾號

中文字幕日韩视频| 色偷偷88欧美精品久久久| 96sao精品视频在线观看| 欧美成人一区二区三区高清| 香蕉久久夜色精品国产更新时间| 在线免费观看视频一区| 超碰人人爱人人| 色av男人的天堂免费在线 | 日韩欧美国产综合在线| 成人午夜在线观看视频| 成人网在线免费视频| 国产精品爽黄69天堂a| 国产一级一片免费播放放a| 国产一区二区电影在线观看| 精品福利一区二区三区| 一级在线免费视频| 亚洲第一av| 一区二区欧美视频| 综合视频免费看| 国产在线观看免费| 不卡的av电影在线观看| 亚洲最大福利网| 糖心vlog精品一区二区| 国产精品入口| 久久久欧美一区二区| 色偷偷www8888| 教室别恋欧美无删减版| 日韩成人在线免费观看| 中文字幕亚洲日本| **国产精品| 精品视频一区二区三区免费| 国产精品欧美激情在线观看| 91超碰国产在线| 亚洲精品国产精品乱码不99 | 精品1卡二卡三卡四卡老狼| 色诱色偷偷久久综合| 深夜国产在线播放| 成人激情免费电影网址| 亚洲在线视频福利| 国产精品高潮呻吟久久久| 日韩av一区二区在线影视| 欧美在线视频在线播放完整版免费观看 | 亚洲精品91天天久久人人| 亚洲综合日本| 97精品国产97久久久久久| 久久久全国免费视频| 欧美区日韩区| 欧美激情精品久久久久久蜜臀| 免费在线观看a级片| 999视频精品| 久久久www成人免费精品| 国产黄色片在线| 天天综合精品| 久热爱精品视频线路一| 成人在线观看小视频| 88国产精品视频一区二区三区| 色偷偷av一区二区三区| 欧洲第一无人区观看| 欧美一区国产在线| 欧美激情xxxx性bbbb| 国产一级视频在线| 国产精品久久777777毛茸茸 | 亚洲天堂网视频| 麻豆91精品视频| 91精品久久久久久久久久久| 国产精选久久久| 国产成人欧美日韩在线电影| 成人免费看片网站| 亚洲av激情无码专区在线播放| 久久久九九九九| 性欧美大战久久久久久久免费观看| 午夜激情视频在线观看| 一区二区三区在线视频观看| 欧美图片激情小说| 芒果视频成人app| 欧美色综合网站| 国产老头和老头xxxx×| 牛牛视频精品一区二区不卡| 国产一区二区日韩| 破处女黄色一级片| 久久成人在线| 成人免费大片黄在线播放| 黄色一级a毛片| 久久久青草青青国产亚洲免观| 一区二区三区四区不卡| 欧美aaaaaaa| 欧美视频在线一区| 中文在线观看免费视频| 国内精品久久久久久久影视简单| 日韩在线激情视频| 日本少妇激情舌吻| 老司机一区二区| 黄色小网站91| 欧洲不卡视频| 黑人精品xxx一区一二区| 九九热99视频| 色婷婷狠狠五月综合天色拍 | 日韩精品av一区二区三区| av中文资源在线| 亚洲高清免费一级二级三级| 深夜黄色小视频| 精品淫伦v久久水蜜桃| 色偷偷888欧美精品久久久| 天天操天天干视频| 国产自产v一区二区三区c| 免费毛片一区二区三区久久久| 中文字幕中文字幕在线中高清免费版| 色综合久久综合| 911亚洲精选| 99精品视频在线| 日韩av不卡电影| 风流少妇一区二区三区91| 国产精品国产自产拍在线| 男人操女人免费软件| 亚洲日本va午夜在线电影| 色伦专区97中文字幕| 特黄视频免费看| 国产91精品一区二区麻豆亚洲| 亚洲国产一区二区三区在线播| 久草在线资源福利站| 日韩写真欧美这视频| 日韩一级片在线免费观看| 国产一区二区三区的电影| 国产精品久久久久久久久久久久午夜片 | 天堂v在线观看| 亚洲一区二区三区美女| 999久久久精品视频| 狠狠色丁香婷婷综合影院| 国产91精品青草社区| 欧美亚洲精品在线观看| 亚洲五码中文字幕| 91aaa精品| 亚洲色图国产| 成人激情视频在线播放| 在线视频1区2区| 在线观看一区二区精品视频| 少妇按摩一区二区三区| 一本久道久久综合婷婷鲸鱼| 国产精品久久久久久久久久久久午夜片| 在线看女人毛片| 日韩欧美一区在线| 久久综合久久鬼| 国产成人综合在线播放| 在线观看成人免费| 国产精品一区二区精品| 欧美老女人性视频| 丰满熟妇乱又伦| 亚洲午夜一区二区三区| 污片免费在线观看| 国产一区成人| 日韩三级电影网站| 精品三区视频| 日韩中文字幕国产精品| 国产又黄又猛又爽| 亚洲黄网站在线观看| 亚洲精品鲁一鲁一区二区三区| 国内精品久久久久久久影视麻豆| 国产精品久久久久久久免费大片 | 成人在线视频亚洲| 日韩视频免费观看高清完整版在线观看 | 色欧美乱欧美15图片| 黄色av免费播放| 久久99日本精品| 丰满人妻一区二区三区53号 | 亚洲黄色在线观看| 日日骚av一区二区| 亚洲欧洲在线观看av| 日本人妻一区二区三区| 性欧美精品高清| 亚洲一区二区精品在线| 日韩在线成人| 欧美亚洲国产日本| 麻豆影视在线观看_| 欧美成人乱码一区二区三区| 97久久久久久久| 国产精品久久久久永久免费观看| 国产成人av免费观看| 国产日韩亚洲| japanese在线视频| 国产精品中文字幕制服诱惑| 国产成人在线播放| 91国内在线| 亚洲欧洲高清在线| 97国产成人无码精品久久久| 亚洲6080在线| 少妇太紧太爽又黄又硬又爽小说| 福利电影一区二区三区| 激情综合网婷婷| 自拍偷拍欧美专区| 欧美日韩亚洲综合一区二区三区激情在线| 成人黄色毛片| 91精品国产成人| 日本精品在线| 亚洲精品一区二区久| 国产毛片毛片毛片毛片毛片| 色综合天天在线| 老湿机69福利| 中文字幕巨乱亚洲| 亚洲精品中文字幕在线播放| 久久成人免费网站| 妺妺窝人体色www在线小说| 91成人影院| 亚洲mv在线看| 日韩av影院| 成人xxxxx色| 欧美成人免费全部网站| 欧美在线视频免费观看| 男男gaygays亚洲| 精品国产自在精品国产浪潮| 青青草免费在线| 精品国产一区二区三区忘忧草| 在线观看毛片av| 福利视频导航一区| 国产奶水涨喷在线播放| 成人欧美一区二区三区黑人麻豆 | 中文字幕成人免费视频| 蜜桃伊人久久| 久久久久久久久久久99| 亚洲综合色站| 在线视频福利一区| 国产一区二区三区不卡视频网站| 精品伊人久久大线蕉色首页| 日韩视频在线直播| 91久久国产精品| 成人在线免费| 国产精品久久二区| 亚洲成人不卡| 在线观看av不卡| 奇门遁甲1982国语版免费观看高清| 亚洲免费国产视频| 欧美一区三区四区| 136福利视频导航| 欧美精品tushy高清| 中文字幕二区三区| 在线观看91精品国产入口| 精品不卡一区二区| 欧美午夜久久久| 国内自拍视频在线播放| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 中文字幕+乱码+中文| 色综合久久久久综合99| 中文字幕黄色片| 在线一区二区三区四区五区 | 亚洲午夜精品一区二区| 欧美日韩国产免费观看视频| 日韩欧美国产二区| 免费av一区二区三区四区| 日本不卡在线播放| 欧美呦呦网站| 中文字幕av久久| 欧美日韩亚洲一区二区三区在线| 黄色成人在线免费观看| 亚洲天堂男人| 黄色免费观看视频网站| 久久裸体视频| 色悠悠久久综合网| 韩国视频一区二区| 黑人无套内谢中国美女| 成人精品视频一区二区三区| 丝袜熟女一区二区三区| 久久久青草青青国产亚洲免观| 国产一区二区三区四区在线| 国产精品女主播av| 欧美激情图片小说| 午夜精品影院在线观看| 久久久黄色大片| 欧美日韩午夜精品| 亚洲欧美强伦一区二区| 亚洲精品视频免费在线观看| jizz日韩| 欧美巨大黑人极品精男| 一本大道色婷婷在线| 国产精品亚洲欧美导航| 涩涩屋成人免费视频软件| 美女精品国产| 婷婷综合五月| 欧美 日韩 国产在线观看| 免费看欧美美女黄的网站| 永久看看免费大片| 久久久久久免费| 国产成人无码aa精品一区| 精品高清一区二区三区| 一级做a爱片性色毛片| 精品国产一区二区三区忘忧草| 国产尤物视频在线| 欧美激情欧美激情| 性感美女一区二区在线观看| 97视频资源在线观看| 久久超碰99| www.好吊操| 另类中文字幕网| 熟女人妻在线视频| 1024成人网| 日韩国产成人在线| 日韩精品中午字幕| 99视频在线观看地址| 久久久天堂国产精品女人| 久久影视精品| 欧洲一区二区日韩在线视频观看免费| 亚洲国产一区二区三区在线播放| 免费在线激情视频| 成人听书哪个软件好| 九九热久久免费视频| 欧美日在线观看| 性生交大片免费看女人按摩| 亚洲欧美日韩中文在线| 成人福利电影| 亚洲自拍av在线| 日韩欧美1区| 毛片av免费在线观看| 成人国产精品视频| 美女福利视频在线观看| 欧美日韩亚洲综合一区| 黄色大片在线看| 97人人爽人人喊人人模波多 | 久久99这里只有精品| 99久久久无码国产精品性| 亚洲亚洲人成综合网络| av中文字幕播放| www日韩中文字幕在线看| 欧美一区 二区 三区| 极品尤物一区二区三区| 欧美天天视频| 69久久精品无码一区二区| 自拍偷拍亚洲综合| 国产精品久久久久久69| 在线视频亚洲欧美| 桃子视频成人app| 欧美少妇一区| 校园激情久久| 色无极影院亚洲| 在线观看视频一区二区欧美日韩| 日韩亚洲视频在线观看| 26uuu亚洲国产精品| 欧美亚洲色图校园春色| 久久亚洲中文字幕无码| 91在线视频免费观看| 久久久久久久黄色片| 亚洲激情免费观看| 人成在线免费网站| 久久久久久久久一区二区| 亚洲视频播放| 国产免费看av| 欧美影视一区在线| 97最新国自产拍视频在线完整在线看| 国产精品成人免费视频| 国产探花在线精品| 一本色道久久亚洲综合精品蜜桃| 国产欧美一区二区精品性| 亚洲 小说区 图片区| 久久久国产一区二区| 精品一区二区三区四区五区| www.国产亚洲| 不卡电影一区二区三区| 久久久成人免费视频| 最近2019中文字幕在线高清| 小说区图片区亚洲| 久久久99精品视频| 99国产麻豆精品| 国产一区二区视频免费| 日韩中文字幕第一页| 99a精品视频在线观看| 黄色免费观看视频网站| 国产精品丝袜黑色高跟| 99久久久无码国产精品免费| 久久欧美在线电影| 久9久9色综合| 日韩欧美中文视频| 精品国产91久久久久久老师| 国产福利免费在线观看| 成人性生交大片免费看视频直播| 极品裸体白嫩激情啪啪国产精品| 国产制服丝袜在线| 欧美日韩国产一区| 日本电影在线观看| 欧美日韩精品不卡| 国产真实乱偷精品视频免| 亚洲国产精一区二区三区性色| 国产香蕉97碰碰久久人人| 欧美1区2区3| 日本成年人网址| 亚洲婷婷综合色高清在线| 天天操天天操天天操| 成人免费福利视频| 99精品国产一区二区青青牛奶 | 亚洲一区二区三区四区五区黄| 天天影院图片亚洲| 91视频国产高清| 欧美亚洲视频| 久久久久久久久久91| 亚洲色图在线观看| 午夜视频在线观看精品中文| 日本熟妇人妻中出| 亚洲成人免费电影| 黄色成人在线| 欧美日韩最好看的视频| 国产精品888| 一区二区视频免费| 欧美中文在线免费| 黄色一区二区三区四区|