轉自:http://www.xuebuyuan.com/1722207.html
結合http://blog.sina.com.cn/s/blog_59d470310100gov8.html來看。
最近要分析程序的性能,所以上網查了查資料,的處理下面結論:
#defineARRAYSIZE 2048
voidmain() {
chararrayA[ARRAYSIZE]={0};
chararrayB[ARRAYSIZE];
memset(array,0, ARRAYSIZE);
}
char arrayA[ARRAYSIZE] = {0};
編譯是先arrayA[0]賦值為0, 再調用memset初始化其他的數組元素.
char arrayA[ARRAYSIZE] = {0};
效率很難比用memset高,因為綜上分析,我覺得給一塊內存賦值的效率很難超越memset。
語法:
#include <cstring>void*memset(void*buffer,intch,size_tcount);
memset()拷貝ch至buffer的前count字符中,並返回buffer。memset()對於以某一值初始化一段內存非常有用。例如,這個命令:
constintARRAY_LENGTH=300;charthe_array[ARRAY_LENGTH]; // zero out the contents of the_arraymemset(the_array,'\0', ARRAY_LENGTH);
…是非常有效率的方法來設置the_array中的所有值為零。
下表比較了兩種不同的方式來初始化字符數組:for循環和memeset()。隨着初始化數據量的增加,memset()很清晰的做的更快:
耗時for循環memset10000.0160.017100000.0550.0131000000.4430.02910000004.3370.291
如連接:
http://topic.csdn.net/u/20100208/10/e67ed254-9129-4afa-bec6-1559f114d803.html
變量的初始化
要是極度追求速度的話,“定義變量並嚴格初始化”並不是一條黃金法則,如果流程上並不需要對變量初始化的話。
這取決於你對“初始化”的概念是怎么理解的。如果你把初始化僅僅理解為變量定義時的初始化的話,那么“定義變量並嚴格初始化”有時就不是必要的了。例如下面的變量a在定義的時候就不需要對它初始化:
int a = 0; // 這里的初始化是多余的,因為它的值從標准輸入設備讀取。
scanf("%d", &a);
很多人就是把“變量的初始化”理解為“變量定義時的初始化”,從而堅持“定義變量並嚴格初始化”這條規則,這其實是不正確的。這樣做會帶來多余的初始化,從而降低了效率。從上面看,樓主已經意識到了這個問題,而且正在着手處理。
變量初始化的正確理解應該是“定義的變量第一次有一個給定的值(狀態)”,無論這個值是通過變量定義時的初始化、定義后的賦值或者函數參數傳遞等方式得到。有這樣的理解,那么“定義變量並嚴格初始化”一般情況下就是一條黃金法則(及其特殊的情況下定義變量只是為了使用它的類型特征,我們不考慮這種情況)。因為定義變量的最終目的就是使用變量(如果不使用它的話,也就不需要定義這個變量了),使用之前變量必須要從程序中得到一個給定值,這樣的使用才是有意義的。
這里的“變量”可以是一般變量、數組、結構體、類(C++)或者動態分配的內存空間。
提出幾條不算成熟的建議:
1:非必要情況不對內存使用memset清零,尤其是大塊內存。
2:如某結構體或內存塊在使用前會逐一賦值,則不需要對其進行memset初始化。
3:字符串的初始化可以對其第一個字節賦值0。
使用strcpy拷貝的字符串不需要進行初始化。
使用strncpy拷貝的字符串,建議不要先進行memset全部清零,而是在strncpy后,根據字符串實際長度,對字符串后一個字節置零。
在做流程判斷的時,盡量減少使用字符串比較,而采用整形或布爾量比較。
4:減少結構體轉換和copy代碼。對結構體尤其是包含長字符串的結構體復制時,建議慎用memcpy,而采取逐一賦值的方式。
5: 非必要不使用malloc和free,不但容易造成內存泄露,而且動態分配內存快時,系統的內存堆狀況可能會影響分配效率(比如內存碎片很多時)。建議對一些動態分配的數組,采用定義一個足夠大的數組方式.(這里有個問題:局部變量的最大尺寸是多少呢,也就是說進程棧空間是多少呢?這個應該是有限制的,但是每種操作系統或編譯器的限制是多少呢,應該不能在棧空間里定義一個幾十M或一個G大的數組吧?)
6:unix程序是基本上是以進程模式運行的,可以合理使用全局靜態變量。減少分配內存的開銷。在多線程程序里慎用全局變量。
我覺得在寫代碼的時候,不但要把功能實現,該精益求精還是盡量注意,也許確實項目組里開發的時候對代碼質量細節控制不是很嚴格吧。