字串陣列初始化0 與memset 0 效率的分析

2021-08-11 15:04:03 字數 2260 閱讀 2553

**

最近要分析程式的效能,所以上網查了查資料,的處理下面結論:

#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陣列的第乙個元...