memset的效率問題

2021-07-09 11:00:52 字數 1143 閱讀 6811

//**經過astyle格式化

void *

memset (dstpp, c, len)

void *dstpp;

int c;

size_t len; //前幾行等同於: void * memset(void *dstpp, int c, size_t len)

xlen = len / (opsiz * 8);

while (xlen > 0) 

// 2號 while

len %= opsiz * 8;//還有len位元組沒有寫

xlen = len / opsiz;

while (xlen > 0) 

// 3號while

len %= opsiz;

} while (len > 0) 

//4號while

return dstpp;

}綜上,我們可以看出來memset在給一塊記憶體賦值時採用的策略。

1:先把將要賦值的塊的起始位址對齊。見1號while。

2:有大於等於8個opsiz長度未寫,一次迴圈寫8個opsiz長。 見2號while。

3:還有小於8個opsiz長度未寫,一次迴圈寫1個opsiz長。 見3號while。

4:還有小於opsiz長度未寫,一次迴圈寫1個位元組。 見4號while。

下面看一看dir/string/test-memset.c中的******_memset.c

char *

******_memset (char *s, int c, size_t n)

上面的這個程式就是簡簡單單地,乙個位元組乙個位元組地賦值了。

和memset.c相比,這個程式有如下缺點:

1:匯流排效率低。因為寫記憶體次數多。

2:迴圈次數太多。每一次迴圈都要判斷要不要跳轉,所以迴圈次數太多造成不必要的判斷太多。

有乙個優點:簡單易懂。

大學時候,選了一門c語言課,那老師很鬱悶,因為他學了多年的計算機,不知道匯流排是什麼,還在那兒罵計算機系的人(他不是計算機系的,好多院系都學計算機),說計算機系的把匯流排搞的那麼玄。他還說為什麼要有strlen,memset等這樣的庫函式,說這樣的函式太容易寫了,給他一分鐘他就可以寫出來。現在想想,讀的書少不是好事。就像鳳姐一樣,讀那麼少的書,以為知音,故事會就是人文社科類的書了。呵呵。。

memset 的效率以及原始碼分析

void memset void s,int ch,size t n 作用 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。不知道有沒有像我一樣把memset當作萬能的初始化工具,例如 int arr ...

memset 的效率以及原始碼分析

void memset void s,int ch,size t n 作用 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。不知道有沒有像我一樣把memset當作萬能的初始化工具,例如 int arr ...

memset 的效率以及原始碼分析

void memset void s,int ch,size t n 作用 將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。不知道有沒有像我一樣把memset當作萬能的初始化工具,例如 int arr ...