bzero 和memset的區別

2021-07-11 01:51:40 字數 3476 閱讀 9016

原型:extern void bzero(void *s, int n);

用法:#include

功能:置位元組字串s的前n個位元組為零且包括『\0』。

說明:bzero無返回值,並且使用strings.h標頭檔案,strings.h曾經是posix標準的一部分,但是在posix.1-2001標準裡面,這些函式被標記為了遺留函式而不推薦使用。在posix.1-2008標準裡已經沒有這些函式了。推薦使用memset替代bzero。

menset

void *memset(void *s, int ch, size_t n);

函式解釋:將s中前n個位元組替換為ch並返回s;

memset:作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法。

常見的三種錯誤

第一: 搞反了ch 和 n的位置.

一定要記住 如果要把乙個char a[20]清零, 一定是 memset(a, 0, 20)

而不是 memset(a, 20, 0)

第二: 過度使用memset, 我想這些程式設計師可能有某種心理陰影, 他們懼怕未經初始化的記憶體, 所以他們會寫出這樣的**:

char buffer[20];

memset(buffer, 0, sizeof((char)*20));

strcpy(buffer, "123");

這裡的memset是多餘的. 因為這塊記憶體馬上就被覆蓋了, 清零沒有意義.

第三: 其實這個錯誤嚴格來講不能算用錯memset, 但是它經常在使用memset的場合出現

關於字元陣列的初始化,在專案的壓力測試中,發現效能明顯下降,變懷疑在程式中的若干臨時字元陣列的初始化(使用bzero)身上。於是修改為首個字元置零的方式而非全部置零的方式初始化,響應得到明顯的提公升。原來在***檢索的每一條結果都要進行bzero對臨時陣列初始化,每乙個請求需要30次的bzero對臨時陣列的置零。於是想到了,在非必要的情況下,只對臨時陣列的第乙個(或前幾個)字元置零的初始化方式對比與使用bzero的話,能夠明顯提高效能。

在此之外,又想起另外兩種對陣列所有位元組都置零的方式,順便比較一下他們之間的效能,寫個簡單的程式如下:

#include

#include

#include

#define timediff(s, e) (((e.tv_sec)-(s.tv_sec))*1000000 + (e.tv_usec) - (s.tv_usec))

int main()

}執行結果:

array size: 1 bzero time: 28 memset time: 1 bzero>memset?: 1

array size: 2 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 4 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 8 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 16 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 32 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 64 bzero time: 1 memset time: 0 bzero>memset?: 1

array size: 128 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 256 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 512 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 1024 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 2048 bzero time: 1 memset time: 1 bzero>memset?: 0

array size: 4096 bzero time: 2 memset time: 2 bzero>memset?: 0

array size: 8192 bzero time: 2 memset time: 2 bzero>memset?: 0

array size: 16384 bzero time: 5 memset time: 6 bzero>memset?: 0

array size: 32768 bzero time: 9 memset time: 8 bzero>memset?: 1

array size: 65536 bzero time: 27 memset time: 24 bzero>memset?: 1

array size: 131072 bzero time: 81 memset time: 68 bzero>memset?: 1

array size: 262144 bzero time: 190 memset time: 169 bzero>memset?: 1

array size: 524288 bzero time: 447 memset time: 393 bzero>memset?: 1

array size: 1048576 bzero time: 996 memset time: 973 bzero>memset?: 1

array size: 2097152 bzero time: 2258 memset time: 2272 bzero>memset?: 0

array size: 4194304 bzero time: 4821 memset time: 4799 bzero>memset?: 1

array size: 8388608 bzero time: 9797 memset time: 9799 bzero>memset?: 0

array size: 16777216 bzero time: 19764 memset time: 19737 bzero>memset?: 1

array size: 33554432 bzero time: 39687 memset time: 39675 bzero>memset?: 1

array size: 67108864 bzero time: 79907 memset time: 79324 bzero>memset?: 1

array size: 134217728 bzero time: 158956 memset time: 158775 bzero>memset?: 1

array size: 268435456 bzero time: 318247 memset time: 318632 bzero>memset?: 0

array size: 536870912 bzero time: 638536 memset time: 638883 bzero>memset?: 0

bzero 和memset的區別

原型 extern void bzero void s,int n 用法 include 功能 置位元組字串s的前n個位元組為零且包括 0 說明 bzero無返回值,並且使用strings.h標頭檔案,strings.h曾經是posix標準的一部分,但是在posix.1 2001標準裡面,這些函式被...

iOS C語言 bzero函式 memset函式

聯絡人 石虎 暱稱 嗡嘛呢叭咪哄 一 ios c語言 bzero函式 bzero tt,sizeof tt struct initialization to zero 結構體初始化到零 bzero s,20 原型 extern void bzero void s,int n 用法 include 功...

fill和memset的區別

最主要的區別是memset是按照位元組填充的。按照單元賦值,將乙個區間的元素都賦予val值。函式引數 fill vec.begin vec.end val val為將要替換的值。include fill vec.begin vec.end val 原來容器中每個元素被重置為val按照位元組填充某字元...