国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

C++程序時間性能優(yōu)化方法

2015-03-16 09:53:37林廣棟
電腦知識與技術(shù) 2015年1期
關(guān)鍵詞:優(yōu)化

林廣棟

摘要: C++是一種廣泛使用且功能靈活的語言,其時間性能難以把握。隨著計算機硬件的發(fā)展,對程序內(nèi)存使用的限制越來越弱,但對程序時間性能的要求依然很高,對優(yōu)化C++程序時間性能的需求仍然存在。有很多方法可以優(yōu)化C++程序的時間性能。一些方法利用了C++語言自身的特點;一些方法犧牲空間性能換取時間性能的提升。軟件工程師應(yīng)根據(jù)具體的應(yīng)用場景選擇適當(dāng)?shù)姆椒▋?yōu)化C++程序的時間性能。

關(guān)鍵詞:C++; STL;時間性能;優(yōu)化

中圖分類號:TP312 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2015)01-0066-04

Methods to Optimize Time Performance of C++ Application

LIN Guang-dong

(NO. 38th Research Institute of China Electronic Technology Group Corporation, Hefei 230088, China)

Abstract:C++ is a widely used flexible programming language. It is difficult to control its timer performance. As the development of hardware of computing system, the limitation of memory usage is becoming weaker and weaker. However, the demand for time performance is still stringent. It is still necessary to optimize the time performance of C++ application. There are many methods to optimize time performance of C++ application. Some methods make advantage of characteristics of C++ language itself; some methods sacrifice space performance to optimize time performance. Software engineers to optimize time performance should select suitable methods according to specific application scenarios.

Key words: C++; STL; Time Performance; Optimization

C++是一種廣泛使用而且功能強大的語言,既支持抽象語言的面向?qū)ο缶幊谭绞?,又支持比較底層的C語言功能,還支持范型編程[1-2]。C++語言已經(jīng)不僅僅是一種單純的語言,而是同時支持多種編程語言的編程語言集合。為了支持C++語言靈活的功能,編譯器會生成程序中沒有顯式出現(xiàn)的數(shù)據(jù)結(jié)構(gòu)和代碼[3]。程序設(shè)計人員是看不到這些數(shù)據(jù)結(jié)構(gòu)和代碼的。只有經(jīng)驗豐富的軟件工程師才能全面了解編譯器自動生成代碼的時機和條件。因此,C++程序的時間性能和空間性能非常難以把握。

隨著硬件技術(shù)的發(fā)展,計算機硬件(如內(nèi)存)越來越廉價,已經(jīng)不是計算的瓶頸。應(yīng)用程序可以使用的內(nèi)存空間越來越寬裕,對程序使用內(nèi)存的限制越來越小。但程序的時間性能在很多應(yīng)用場景下依然關(guān)鍵,如:實時嵌入式系統(tǒng)、需要處理大量數(shù)據(jù)的場景、對通信速率要求高的場景、對程序響應(yīng)速度要求高的場景等等。在這些應(yīng)用場景中,可以通過犧牲空間性能的方式換來時間性能的提升。

本文介紹了幾種提高C++程序時間性能的方法。有些方法利用了C++語言的特點,可以單純地提高程序的時間性能,如1.1、1.2、1.5、1.7中介紹的方法。有些方法犧牲了程序的空間性能來優(yōu)化時間性能,如1.3、1.6、1.8.1、1.8.3中介紹的方法。其他方法有些是編程習(xí)慣,有些是一種策略,需要軟件設(shè)計師根據(jù)應(yīng)用場景需要合理使用。

1 時間性能優(yōu)化方法

1.1 盡可能減少臨時對象

臨時對象指C++程序中并未顯式定義,由編譯器生成的對象。臨時對象一般在以下場景下出現(xiàn):

1) 對象作為參數(shù)傳入函數(shù);

2) 對象作為返回結(jié)果由函數(shù)返回;

作為一種面向?qū)ο蟮木幊陶Z言,C++程序中,大量使用類。每個類都有用戶自定義的或編譯器默認(rèn)生成的構(gòu)造函數(shù)和析構(gòu)函數(shù)。這些類的實例作為參數(shù)傳入函數(shù)時,或作為返回結(jié)果返回調(diào)用者時,都會產(chǎn)生臨時對象,并會調(diào)用相應(yīng)的復(fù)制構(gòu)造函數(shù),同時還會調(diào)用這些臨時對象的析構(gòu)函數(shù)。如下代碼所示:

Class A

{String name;

int a;

};

A fun(A a)

{A b;

Return b;}

A類雖然沒有定義復(fù)制構(gòu)造函數(shù),但編譯器會為A類生成默認(rèn)的復(fù)雜構(gòu)造函數(shù),該函數(shù)調(diào)用string類的復(fù)雜構(gòu)造函數(shù)來復(fù)制name成員變量,并復(fù)制成員變量a。fun函數(shù)的調(diào)用會導(dǎo)致A類的復(fù)制構(gòu)造函數(shù)兩次被調(diào)用。一次是在A類實例作為參數(shù)傳入fun函數(shù)時。一次是在A類實例作為結(jié)果返回給調(diào)用者時。如果A類的定義比較復(fù)雜,例如其中包含大量的成員變量或繼承自復(fù)雜的基類,則A類復(fù)雜構(gòu)造函數(shù)將會調(diào)用這些成員變量(或基類)的復(fù)制構(gòu)造函數(shù),導(dǎo)致大量不必要的計算時間浪費。優(yōu)化的fun函數(shù)定義方法是:

Int fun(const A &a, A &b)

{…

Return OK;}

此時,參數(shù)a以常量引用的方式使用,不會導(dǎo)致復(fù)制構(gòu)造函數(shù)的調(diào)用。而返回結(jié)果則存儲在以引用方式傳入的參數(shù)b中,同樣不會導(dǎo)致復(fù)制構(gòu)造函數(shù)的調(diào)用。最后,fun函數(shù)返回整型作為成功標(biāo)志或錯誤碼。

1.2 盡可能使用初始化列表

對象的構(gòu)造函數(shù)在對象被創(chuàng)建時調(diào)用,完成基類構(gòu)造、成員變量初始化等初始化工作。在構(gòu)造函數(shù)體內(nèi),成員變量實際上已經(jīng)創(chuàng)建了。如果在構(gòu)造函數(shù)體內(nèi)對成員變量初始化,相當(dāng)于對成員變量進(jìn)行重新賦值。而使用初始化列表,則相當(dāng)于使用參數(shù)初始化成員變量,僅僅調(diào)用一次成員變量的構(gòu)造函數(shù)。如下代碼:

A::A(int pa, char *p)

{a=pa;

Name=p; (1)

}

當(dāng)進(jìn)入A的構(gòu)造函數(shù)體內(nèi)時,string類成員變量name實際上已經(jīng)創(chuàng)建了,語句(1) 實際上調(diào)用的是string類的重載的“=”操作符函數(shù)。這樣A類的構(gòu)造過程中,調(diào)用了一次name成員變量的構(gòu)造函數(shù)和“=”重載函數(shù)。更高效的代碼如下:

A::A(int pa, char *p):a(pa),name(p){};

1.3 合理使用inline

inline函數(shù)使編譯器在函數(shù)調(diào)用處用函數(shù)體代碼代替函數(shù)調(diào)用指令。在生成的可執(zhí)行文件中,在調(diào)用函數(shù)處插入函數(shù)體中的代碼。這樣,程序執(zhí)行到該函數(shù)的調(diào)用時,實際上并沒有進(jìn)行調(diào)用函數(shù)時在函數(shù)棧上的進(jìn)棧出棧等操作,而是直接執(zhí)行函數(shù)體中的代碼。

inline函數(shù)至少在如下三個方面提高了程序的時間性能:

1) 避免了函數(shù)調(diào)用必須執(zhí)行的壓棧出棧等操作;

2) 由于函數(shù)體代碼被移到函數(shù)調(diào)用處,編譯器可以獲得更多的上下文信息,并根據(jù)上下文信息對調(diào)用者的代碼和函數(shù)體代碼進(jìn)行更進(jìn)一步的優(yōu)化;

3) 若不使用inline函數(shù),程序執(zhí)行至函數(shù)調(diào)用處,需要轉(zhuǎn)而去執(zhí)行函數(shù)體所在位置的代碼。一般函數(shù)調(diào)用位置與函數(shù)代碼所在位置在代碼段中并不相近,這樣很容易形成操作系統(tǒng)的缺頁中斷。操作系統(tǒng)需要把缺頁地址處的代碼從硬盤移入內(nèi)存,所需時間將成數(shù)量級增加。而使用inline函數(shù)則可以減少缺頁中斷發(fā)生的機會。

由于inline函數(shù)在函數(shù)調(diào)用處插入函數(shù)體代碼代替函數(shù)調(diào)用,若該函數(shù)在程序的很多位置被調(diào)用,有可能造成內(nèi)存空間的浪費。一般函數(shù)的壓棧出棧操作也需要一定代碼,這段代碼完成棧指針調(diào)整、參數(shù)傳遞、現(xiàn)場保存和恢復(fù)等操作。若函數(shù)的函數(shù)體代碼量小于編譯器生成的函數(shù)壓棧出棧代碼,則可以放心地將其定義為inline。在這種情況下使用函數(shù)體代碼替換函數(shù)調(diào)用代碼反而會減小代碼占用的內(nèi)存空間。而當(dāng)函數(shù)體代碼大于函數(shù)壓棧出棧代碼時,將函數(shù)定義為inline就會增加內(nèi)存空間的使用,且函數(shù)調(diào)用位置越多,這種內(nèi)存空間浪費就越多。但若某個函數(shù)在應(yīng)用程序中被高頻度地調(diào)用,已經(jīng)成為影響程序時間性能的瓶頸,則可以犧牲程序的空間性能,將該函數(shù)定義為inline,以提高其調(diào)用時間性能。C++程序應(yīng)該根據(jù)應(yīng)用的具體場景,根據(jù)函數(shù)體的大小、調(diào)用位置多少、函數(shù)調(diào)用的頻率、應(yīng)用場景對時間性能的要求、應(yīng)用場景對內(nèi)存性能的要求等各方面因素,合理決定是否定義inline函數(shù)。

1.4 謹(jǐn)慎使用虛函數(shù)

虛函數(shù)是C++語言最重要的特性之一,它使得運行時多態(tài)成為可能。很多基于C++語言的設(shè)計模式都是基于虛函數(shù)實現(xiàn)的。虛函數(shù)統(tǒng)一了一個基類的不同子類的接口,使子類的實現(xiàn)者和使用者可以分別獨立設(shè)計。虛函數(shù)雖然有助于設(shè)計,但是它會帶來額外的內(nèi)存負(fù)擔(dān)和時間負(fù)擔(dān)。每一個定義虛函數(shù)的類都需要有一張?zhí)摵瘮?shù)表,用以存儲虛函數(shù)指針。每個該類的實例都帶有一個虛函數(shù)表指針,指向該類的虛函數(shù)表。調(diào)用虛函數(shù)時,首先通過虛函數(shù)表指針找到虛函數(shù)表,然后在虛函數(shù)表中找虛函數(shù)地址,最后再利用該地址調(diào)用找到的虛函數(shù)。顯然,虛函數(shù)的時間性能不如非虛函數(shù)。因此,應(yīng)用程序應(yīng)當(dāng)綜合考慮虛函數(shù)對于設(shè)計的益處和對時間性能的負(fù)擔(dān)。當(dāng)虛函數(shù)調(diào)用成為系統(tǒng)時間性能的瓶頸時,如非必要,盡量減少虛函數(shù)的使用。

1.5 合理使用智能指針

指針是C++程序中常用的類型。若合理使用指針,既可以節(jié)省內(nèi)存,也可以節(jié)省運行時間。例如,若我們需要把很多復(fù)雜的信息存儲在程序內(nèi)部。我們把一個信息單元存儲在一個類中,然后把該類的對象存儲在某種STL容器中。若直接存儲對象,一方面會使一個信息單存儲在內(nèi)存中多個對象中,造成內(nèi)存空間的浪費;另一方面對象從容器中存入、取出時都會造成大量的運行時間浪費。而如果存儲對象的指針,則一個信息單元只需要一個對象存儲,且指針從容器中存入和取出的時間性能更高。但指針有一個致命的缺陷:容易造成內(nèi)存泄露,不利于軟件設(shè)計。軟件工程師必須準(zhǔn)確控制指針在何時何處被釋放。若指針沒有釋放,會造成內(nèi)存泄露;若同一個指針被多次釋放,程序會產(chǎn)生異常。

C++的開源程序庫Boost庫中定義了智能指針,包括普通智能指針shared_ptr和智能數(shù)組指針shared_array[4]。智能指針實際上是一個類,其中成員變量包括普通指針和其引用計數(shù)。引用記數(shù)記錄程序引用該指針的次數(shù)。該類可以在指針不再被使用時自動將其釋放。C++11標(biāo)準(zhǔn)已經(jīng)把智能指針加入到標(biāo)準(zhǔn)中。智能指針既具有普通指針節(jié)省內(nèi)存和時間的優(yōu)點,又將軟件工程師從控制指針的釋放這一繁重任務(wù)中解脫出來。因此,程序中涉及到對象的存儲、轉(zhuǎn)發(fā)等應(yīng)用時,應(yīng)合理使用智能指針。

1.6 使用vector前先reserve

Vector是一種常見的STL容器,其內(nèi)部使用連續(xù)內(nèi)存儲存數(shù)據(jù)。若連續(xù)內(nèi)存不足以存儲數(shù)據(jù)時,vector對象會開辟新的連續(xù)內(nèi)存,并把原內(nèi)存中的實例復(fù)制到新內(nèi)存中。若vector容器中存儲的是類,復(fù)制過程中會調(diào)用該類的復(fù)制構(gòu)造函數(shù)。Vector容器的size()方法返回容器中元素的個數(shù),而capacity()方法返回容器當(dāng)前內(nèi)存可以容納的元素的個數(shù)。不同的編譯器對vector每次開辟內(nèi)存的大小定義不同。有些編譯器定義為原來大小的2倍,有些是1.5倍。例如,Visual Stdio 2008環(huán)境下自帶的STL,每次vector調(diào)整內(nèi)存大小為原來的1.5倍。若連續(xù)地調(diào)用push_back向vector中存儲數(shù)據(jù),則通過capacity()得到的vector可以存儲的元素個數(shù)以0、1、2、3、4、6、9。。。的規(guī)律遞增。顯然,每次vector調(diào)整內(nèi)存大小,都會調(diào)用一次所有元素的復(fù)制構(gòu)造函數(shù)。例如,當(dāng)容器大小由1調(diào)整為2時,需要調(diào)用其中的第一個元素的復(fù)制構(gòu)造函數(shù),以使其存儲在新的位置。若vector容器中存儲的是復(fù)雜的類,則vector容器在放入最初10個元素的過程中將會引起25次不必要的復(fù)制構(gòu)造函數(shù)調(diào)用。

Vector的reserve方法可以預(yù)先為其分配內(nèi)存。只有當(dāng)該內(nèi)存被填滿時,才會分配新的內(nèi)存,并調(diào)用元素的復(fù)制構(gòu)造函數(shù)。因此,在使用vector之前,若能根據(jù)應(yīng)用具體場景判斷其存儲元素的大致個數(shù),應(yīng)先調(diào)用reserve函數(shù),分配一定內(nèi)存,以避免不必要的復(fù)制構(gòu)造函數(shù)調(diào)用。

例如,如下程序:

Vector v;//v是存儲類A的vector容器

For(int i=0;i<10;i++)

{A a;

初始化a;

v.push_back(a);

}

應(yīng)改為:

Vector v;

v.reserve(10);

For(int i=0;i<10;i++)

{A a;

初始化a;

v.push_back(a);

}

當(dāng)A是一個復(fù)雜的類時,后者的時間性能將顯著優(yōu)于前者。

1.7 盡可能使用STL的成員函數(shù)

STL容器定義了很多常用的操作,如插入、賦值等等,如assign、insert、erase、empty、resize、count等等。軟件工程師應(yīng)熟悉這些成員函數(shù)的含義并盡可能使用它們。STL容器的成員函數(shù)不僅使程序看起來簡潔清晰,還可以提高效率。這些成員函數(shù)會針對容器的內(nèi)部存儲結(jié)構(gòu),對操作進(jìn)行優(yōu)化。

若STL容器成員函數(shù)操作的對象是一定區(qū)間內(nèi)的一系列元素,這種成員函數(shù)稱為區(qū)間成員函數(shù)[5]。區(qū)間成員函數(shù)包括:區(qū)間構(gòu)造函數(shù)、區(qū)間插入、區(qū)間刪除、區(qū)間賦值等等。完成同樣的功能,區(qū)間成員函數(shù)的時間性能顯著高于每次針對容器中一個元素進(jìn)行操作以完成相同功能的一段代碼。例如,把數(shù)組中存儲的m個數(shù)據(jù)插入到大小為n的vector的頭部,若針對每個數(shù)據(jù)單獨使用一次insert操作,共需調(diào)用n次insert函數(shù)。每次插入都需要移動vector內(nèi)的全部數(shù)據(jù),共需移動約n*m次。而若使用insert區(qū)間插入成員函數(shù),則只需要調(diào)用1次insert函數(shù),該函數(shù)直接根據(jù)插入數(shù)據(jù)的多少把vector中的數(shù)據(jù)移動至最終位置,共需移動約n次。顯然,使用區(qū)間插入成員函數(shù)插入時間性能更好。

1.8 設(shè)計良好的數(shù)據(jù)結(jié)構(gòu)

應(yīng)用程序是由數(shù)據(jù)結(jié)構(gòu)和算法組成的。算法是在數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上對數(shù)據(jù)進(jìn)行操作的方法,因此,設(shè)計良好的數(shù)據(jù)結(jié)構(gòu)是高效率程序的基礎(chǔ)。C++標(biāo)準(zhǔn)庫提供了很多高效的數(shù)據(jù)結(jié)構(gòu),如vector、list、map、set等等。軟件工程師應(yīng)熟悉這些數(shù)據(jù)結(jié)構(gòu)。合理使用STL容器可以減少軟件工程師的開發(fā)負(fù)擔(dān),提高程序的時間性能。

1.8.1 合理選擇使用vector和map

vector相當(dāng)于大小可變的數(shù)組,用于存儲數(shù)量不固定的一組數(shù)據(jù)。map適合存儲需要由關(guān)鍵詞定位到數(shù)據(jù)的信息。但并不是所有需要由關(guān)鍵詞定位到數(shù)據(jù)的信息都適合用map存儲。若關(guān)鍵詞是整數(shù)且關(guān)鍵詞的范圍和數(shù)據(jù)量的大小差不多,則可以把數(shù)據(jù)存儲到vector中,關(guān)鍵詞經(jīng)過轉(zhuǎn)換后作為vector的下標(biāo)訪問數(shù)據(jù)。由下標(biāo)訪問vector中的數(shù)據(jù)需要的時間復(fù)雜度是O(1),而map由關(guān)鍵詞定位到數(shù)據(jù)的時間復(fù)雜度是O(logn)。顯然,當(dāng)可以由關(guān)鍵詞轉(zhuǎn)換為整數(shù)下標(biāo)時,應(yīng)使用vector存儲數(shù)據(jù)。

1.8.2 合理選擇使用vector和list

vector中的數(shù)據(jù)存儲在連續(xù)的內(nèi)存中,而list的底層數(shù)據(jù)結(jié)構(gòu)是鏈表。list中的數(shù)據(jù)是分散在內(nèi)存中的,相鄰的數(shù)據(jù)通過指針建立索引。vector和list各有優(yōu)缺點。

vector的優(yōu)點:vector中的數(shù)據(jù)存儲在連續(xù)的內(nèi)存中,可以由數(shù)據(jù)序號直接定位至數(shù)據(jù),由下標(biāo)定位至數(shù)據(jù)的時間復(fù)雜度是O(1);

vector的缺點:若需要在一組數(shù)據(jù)的中間插入或刪除數(shù)據(jù),則需要移動該位置以后的所有數(shù)據(jù),時間復(fù)雜度為O(n);

list的優(yōu)點:插入數(shù)據(jù)時,只需要修改相鄰數(shù)據(jù)的指針即可,時間復(fù)雜度為O(1)。

list的缺點:由于list中數(shù)據(jù)之間通過指針鏈接,無法通過下標(biāo)定位數(shù)據(jù),定位一個數(shù)據(jù)的時間復(fù)雜度是O(n);

軟件工程師應(yīng)根據(jù)應(yīng)用場景的具體需求,合理選擇list或vector。若需要頻繁地在一組數(shù)據(jù)的開頭和結(jié)尾插入和刪除數(shù)據(jù),應(yīng)使用list。若需要在一個容器中存儲一組數(shù)據(jù),存儲完成之后不再增加刪除,但需要頻繁地根據(jù)下標(biāo)訪問這組數(shù)據(jù),則應(yīng)使用vector。

1.8.3 熟悉散列容器

C++11標(biāo)準(zhǔn)之前,標(biāo)準(zhǔn)庫中沒有定義散列容器。但很多STL的實現(xiàn)了散列容器hash_map與hash_set。Boost庫中也定義了hash_map與hash_set[4]。與普通的map和set使用紅黑樹的底層數(shù)據(jù)結(jié)構(gòu)不同,散列容器使用哈希表來存儲數(shù)據(jù),并對常用的數(shù)據(jù)類型定義了默認(rèn)的哈希算法。C++11標(biāo)準(zhǔn)庫中定義了散列容器unodered_map和unordered_set。散列容器的訪問時間復(fù)雜度是O(1),優(yōu)于普通map和set。

1.9 使用更好的算法

適合應(yīng)用場景的數(shù)據(jù)結(jié)構(gòu)是高效率程序的基礎(chǔ),而優(yōu)化的算法則可以進(jìn)一步提高程序的時間性能。在確定一個適合應(yīng)用場景的數(shù)據(jù)結(jié)構(gòu)后,軟件工程師應(yīng)根據(jù)應(yīng)用場景和應(yīng)用程序的特點,設(shè)計高效率的算法。

1.9.1 合理使用STL算法

C++標(biāo)準(zhǔn)庫定義了很多常用的算法,合理使用這些算法既可以減少工作量,又可以減少出錯的機會。C++標(biāo)準(zhǔn)庫中的算法包括:查找、計數(shù)、遍歷、排序、集合算法等等。通常情況下,使用這些成熟的算法比從無到有重新編寫這些算法的時間性能要高。

1.9.2 使用函數(shù)對象

在使用C++標(biāo)準(zhǔn)庫中的算法時,常常需要提供一個供算法使用的函數(shù)。如排序需要一個比較大小的函數(shù),遍歷算法需要一個對數(shù)據(jù)進(jìn)行操作的函數(shù)。提供函數(shù)的方法有兩種:一種是直接提供函數(shù)地址(或存儲函數(shù)地址的函數(shù)指針);另一種是提供函數(shù)對象。函數(shù)對象是重載了“()”運算符的對象。若使用inline方式重載“()”運算符,使用函數(shù)對象的時間性能要優(yōu)于使用函數(shù)地址。使用函數(shù)地址時,STL算法看不到函數(shù)的具體內(nèi)容,只能通過指針的方式調(diào)用算法,無法進(jìn)行任何代碼優(yōu)化。而使用函數(shù)對象,STL算法可以看到函數(shù)對象的類型,并且具有了inline函數(shù)提高時間性能的優(yōu)點:一方面STL算法內(nèi)部不需要函數(shù)調(diào)用,另一方面編譯器可以根據(jù)算法的上下文信息對代碼進(jìn)行優(yōu)化。因此,使用STL算法時,應(yīng)盡量用函數(shù)對象替換函數(shù)地址。

2 結(jié)論

本文介紹了幾種優(yōu)化C++程序時間性能的方法。有些方法對所有的C++程序都適用;有些方法需要根據(jù)具體應(yīng)用場景選擇是否使用。要提高C++程序的時間性能,最重要的還是找到影響程序時間性能的關(guān)鍵代碼,分析程序的具體應(yīng)用場景,結(jié)合編程語言的特點,才能找到合適的方法。

參考文獻(xiàn):

[1] 李普曼,拉喬伊,默.C++ Primer中文版[M].王剛,楊巨峰,譯.5版.北京:電子工業(yè)出版社,2013.

[2] 梅耶斯.Effective C++ 中文版[M].侯捷,譯.3版.北京:電子工業(yè)出版社,2011.

[3] 馮宏華,徐瑩,程遠(yuǎn),等,左邊.C++應(yīng)用程序性能優(yōu)化[M].2版.北京:電子工業(yè)出版社,2010.

[4] 羅劍鋒. Boost程序庫完全開發(fā)指南——深入C++“準(zhǔn)”標(biāo)準(zhǔn)庫[M].2版.北京:電子工業(yè)出版社,2013.

[5] 梅耶斯.Effective STL中文版[M].潘愛民,陳銘,鄒開紅,譯.北京:科學(xué)出版社,2013.

猜你喜歡
優(yōu)化
超限高層建筑結(jié)構(gòu)設(shè)計與優(yōu)化思考
PEMFC流道的多目標(biāo)優(yōu)化
能源工程(2022年1期)2022-03-29 01:06:28
民用建筑防煙排煙設(shè)計優(yōu)化探討
關(guān)于優(yōu)化消防安全告知承諾的一些思考
一道優(yōu)化題的幾何解法
由“形”啟“數(shù)”優(yōu)化運算——以2021年解析幾何高考題為例
圍繞“地、業(yè)、人”優(yōu)化產(chǎn)業(yè)扶貧
事業(yè)單位中固定資產(chǎn)會計處理的優(yōu)化
4K HDR性能大幅度優(yōu)化 JVC DLA-X8 18 BC
幾種常見的負(fù)載均衡算法的優(yōu)化
電子制作(2017年20期)2017-04-26 06:57:45
炉霍县| 铁岭县| 民丰县| 交口县| 长子县| 岳池县| 浦城县| 镇原县| 治多县| 万安县| 广河县| 逊克县| 凤山县| 安国市| 舞阳县| 监利县| 宜宾市| 高雄县| 孝义市| 铁岭县| 伊春市| 庄河市| 德化县| 凌源市| 同心县| 夹江县| 乌拉特后旗| 平泉县| 六枝特区| 遂川县| 循化| 博湖县| 万州区| 汽车| 临高县| 湘潭县| 额尔古纳市| 砚山县| 灵寿县| 曲周县| 阿勒泰市|