**
最近要分析程式的效能,所以上網查了查資料,的處理下面結論:
#definearraysize 2048
voidmain() ;
chararrayb[arraysize];
memset(array,0, arraysize);
}char arraya[arraysize] = ;
編譯是先arraya[0]賦值為0, 再呼叫memset初始化其他的陣列元素.
char arraya[arraysize] = ;
效率很難比用memset高,因為綜上分析,我覺得給一塊記憶體賦值的效率很難超越memset。
memset
語法:#include 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
如連線:
變數的初始化
要是極度追求速度的話,「定義變數並嚴格初始化」並不是一條**法則,如果流程上並不需要對變數初始化的話。
這取決於你對「初始化」的概念是怎麼理解的。如果你把初始化僅僅理解為變數定義時的初始化的話,那麼「定義變數並嚴格初始化」有時就不是必要的了。例如下面的變數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程式是基本上是以程序模式執行的,可以合理使用全域性靜態變數。減少分配記憶體的開銷。在多執行緒程式裡慎用全域性變數。
我覺得在寫**的時候,不但要把功能實現,該精益求精還是盡量注意,也許確實專案組裡開發的時候對**質量細節控制不是很嚴格吧。
字串陣列初始化
1 char arr 10 hi 初始化字串陣列時,編譯器自動將字串最後乙個字元後面加上 0 以表示字串的結束。如果陣列的大小大於字串的長度 1,那麼把字串結束後面的元素也都初始化為 0 看這段程式 定義乙個大小為12的字串陣列 char str1 12 jiajia 讓乙個char型的指標指向這個...
字串初始化與陣列越界問題。
string p1 abcd char p2 abcd char p3 abcd sizeof p3 5 字串結尾都有系統自動補 0 可用作判斷字串結束標誌 字元陣列和字串最明顯的區別就是字串會被預設的加上結束符 0 char p4 4 abcd 在定義時 系統提示字元太長編譯不通過。abcd 長度...
字串初始化
在c語言程式設計中,當我們宣告乙個字串陣列的時候,常常需要把它初始化為空串。總結起來有以下三種方式 1 char str 10 2 char str 10 3 char str 10 str 0 0 第 1 2 種方式是將str陣列的所有元素都初始化為 0 而第 3 種方式是只將str陣列的第乙個元...