//**經過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 ...