日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

memset()的效率以及源码分析

發布時間:2024/7/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 memset()的效率以及源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
void *memset(void *s, int ch, size_t n);
作用:將s所指向的某一塊內存中的每個字節的內容全部設置為ch指定的ASCII值, 塊的大小由第三個參數指定,這個函數通常為新申請的內存做初始化工作。
不知道有沒有像我一樣把memset當作萬能的初始化工具,例如:
int arr[n];
memset(arr,1,n*sizeof(int));
這樣得到的arr數組一定不是全0,而是16843009,下面解釋原因。
首先,變量類型的本質只是標志從某一內存地址開始讀取的位數,強制轉換就是改變讀取位數的大小。

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

void *(memset) (void *s,int c,size_t n) {const unsigned char uc = c;unsigned char *su;for(su = s;0 < n;++su,--n)*su = uc;return s; } 第3行把int類型的c轉換成unsigned char類型,意味著截去c的高24位,只保留低8位。第4行把s當作unsigned char*類型,也就是說su中的每一個元素按8位計算。
現在來看看文章開頭的那個代碼會做什么。
c的二進制 : 00000000000000000000000000000001(32位)
1、c轉換為unsigned char 后:00000001(8位)
2、將指針su(unsigned char類型)的每一元素(8位)賦值為00000001,循環4n次。
3、memset()結束后,arr的每個元素按照int類型讀取,讀出來的就是1000000010000000100000001,十進制就是16843009。

不過如果是memset(arr,0,n*sizeof(int));的話可以使用,因為32位都是0

再來說memset()的效率問題。使用memset函數與將上面的函數代碼寫在自己的程序里是不一樣的,C標準庫中的memset對Cache的利用做了優化,具體的在《C專家編程》151頁有解釋(其實是我沒看懂),這里給出測試:

#include <string.h> #define MAXSIZE 100000int 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));的情況,效率比手動賦值要高的多。




總結

以上是生活随笔為你收集整理的memset()的效率以及源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。