[英]Memset Definition and use
function memset()
有什么用處?
定義:將ptr指向的memory塊的前num字節設置為指定值(解釋為無符號字符)。
這是否意味着它對 memory 地址中的值進行硬編碼?
memset(&serv_addr,0,sizeof(serv_addr)
是我試圖理解的例子。
有人可以用非常簡單的方式解釋嗎?
memset()
是相對簡單操作的非常快速的版本:
void* memset(void* b, int c, size_t len) {
char* p = (char*)b;
for (size_t i = 0; i != len; ++i) {
p[i] = c;
}
return b;
}
也就是說, memset(b, c, l)
將從地址b
開始的l
個字節設置為值c
。 它的執行速度比上述實現要快得多。
memset()
通常用於初始化值。 例如,考慮以下結構:
struct Size {
int width;
int height;
}
如果您像這樣在堆棧上創建其中之一:
struct Size someSize;
然后該結構中的值將是不確定的。 它們可能為零,也可能是上次使用那部分堆棧時發生的任何值。 所以通常您會遵循以下原則:
memset(&someSize, 0, sizeof(someSize));
當然,它也可以用於其他情況,這只是其中之一。 只需將其視為簡單地將一部分內存設置為某個值的方法即可。
memset
是一種將內存區域設置為0的常用方法,而與數據類型無關。 可以說memset
不在乎數據類型,而只是將所有字節設置為零。
C ++中的IMHO應該避免在可能的情況下執行memset
,因為它會繞過C ++提供的類型安全,而應該使用構造函數或初始化作為初始化的手段。 在類實例上完成的memset可能還會無意中破壞某些內容:
例如
class A
{
public:
shared_ptr<char*> _p;
};
上面實例的memset
不能正確執行參考計數器遞減。
我猜serv_addr
是某些struct
類型的本地變量或全局變量-也許是struct sockaddr
(或者可能是一個class
)。
&serv_addr
正在獲取該變量的地址。 這是有效的地址,作為memset
第一個參數給出。 memset
的第二個參數是用於填充的字節(零字節)。 memset
的最后一個參數是要填充的內存區域的大小(以字節為單位),它是示例中該serv_addr
變量的大小。
因此,此對memset
調用將清除包含某些struct
的全局或局部變量serv_addr
。
實際上, GCC編譯器在進行優化時會為此生成聰明的代碼,通常會對其進行展開和內聯(實際上,它通常是內置的,因此GCC可以為其生成非常聰明的代碼)。
就是將內存設置為特定值。
這是示例代碼。
Memset(const * p,unit8_t V,unit8_t L),這里P是指向目標內存的指針,V是指向目標緩沖區的值,該值將被設置為值V,而l是數據的長度。
while(L --> 0)
{
*p++ = V;
}
memset-設置內存中的字節
概要-
#include<string.h>
無效* memset(無效* s,int c,size_t n)
描述-memset()函數應將c(轉換為無符號字符)復制到s所指向的對象的前n個字節中的每個字節中。 對於上述函數,memset()將返回s的值。
serv_addr = {0};而不是增加對 memset 的例行調用開銷; 也可以做
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.