天天看點

memset源碼及效率分析

參照大佬部落格:點選打開連結

頭檔案:string.h,它是以位元組為機關進行填充的,起調用過程涉及三個參數,分别是首位址,每位元組填充的數(由源碼可知,如果該數超過一位元組,隻截取最後一位元組,也就是後八個二進制位),總位元組數。

下面來看memset的實作:(代碼來自《C标準庫》P398)

memset(arr,0,n*sizeof(int));

void *(memset) (void *s,int c,size_t n)
{
	const unsigned char uc = c;    //unsigned char占1位元組,意味着隻截取c的後八位
	unsigned char *su;
	for(su = s;0 < n;++su,--n)
		*su = uc;
	return s;
}
           

對于上述的這樣一個調用,for循環執行4*n次,int占4個位元組。

memset效率問題,這裡給出測試:

#include <string.h>
#define MAXSIZE 100000

int main()
{
    char arr[MAXSIZE];
    for(int i=0;i<10000;i++)
    {
        memset(arr,'0',sizeof(arr));
//        for(int j=0;j<MAXSIZE;j++)
//            arr[0] = '0';
    }
    return 0;
}
           

程式裡的注釋部分與memset行分别使用,結果是使用memset的程式運作時間大約為0.1s,而用for循環的程式要3s多。

綜上:memset()可以用在字元數組的初始化以及類似于memset(arr,0,n*sizeof(int));的情況,效率比手動指派要高的多。

繼續閱讀