175

sock_addr_in前学期に受講したシステム プログラミングのクラスでは、基本的なクライアント/サーバーを C で実装する必要がありました。や char バッファー (クライアントとサーバー間でデータをやり取りするために使用したもの)などの構造体を初期化するとき、教授は初期化せbzeroずに使用するように指示されmemsetました。彼は理由を説明していませんが、これに正当な理由があるかどうか知りたいですか?

ここに表示されます: http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdownbzero、メモリをゼロにするだけなので、より効率的です。追加のチェックを行う必要memsetがあります。memsetそれでも、メモリをゼロにするために絶対に使用しない理由のようには思えません。

bzero非推奨と見なされ、さらに標準の C 関数ではありません。マニュアルによると、この理由からmemset優先されます。bzeroでは、なぜbzeroover を使用したいのでしょうmemsetか? 効率の向上のためだけですか、それともそれ以上のことですか? 同様に、それを新しいプログラムの事実上の推奨オプションにするmemset以上の利点は何ですか?bzero

4

9 に答える 9

4

bzero と memset の引数について言及したいと思います。ltrace をインストールして、ボンネットの下での動作を比較します。libc6 (2.19-0ubuntu6.6) を使用する Linux では、行われる呼び出しはまったく同じです (経由ltrace ./test123):

long m[] = {0}; // generates a call to memset(0x7fffefa28238, '\0', 8)
int* p;
bzero(&p, 4);   // generates a call to memset(0x7fffefa28230, '\0', 4)

私は、libc の深層部やカーネル/syscall インターフェースで作業していない限り、それらについて心配する必要はないと言われました。私が心配する必要があるのは、呼び出しがバッファーをゼロにするという要件を満たしていることだけです。他の人がどちらが他のものよりも好ましいかについて言及しているので、ここでやめます.

于 2015-04-22T14:20:11.530 に答える
4

おそらく使用しないでくださいbzero。実際には標準 C ではなく、POSIX のものでした。

また、「だった」という単語に注意してください。これは、POSIX.1-2001 で非推奨になり、POSIX.1-2008で memset を尊重して削除されたため、標準の C 関数を使用したほうがよいでしょう。

于 2013-08-20T09:28:30.220 に答える
3

お好みでどうぞ。:-)

#ifndef bzero
#define bzero(d,n) memset((d),0,(n))
#endif

ご了承ください:

  1. オリジナルbzeroは何も返さず、memsetvoid ポインタ ( d) を返します。これは、定義で typecast を void に追加することで修正できます。
  2. #ifndef bzero元の関数が存在する場合でも、それを非表示にすることはできません。マクロの存在をテストします。これにより、多くの混乱が生じる可能性があります。
  3. マクロへの関数ポインタを作成することはできません。関数ポインターを介して使用する場合bzero、これは機能しません。
于 2014-03-20T20:15:09.943 に答える
3

memset 関数の場合、2 番目の引数は anintで、3 番目の引数はsize_t,です。

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

これは通常はunsigned intですが、2 番目と 3 番目の引数のような値が0 and 16それぞれ 16 と 0 のように間違った順序で入力された場合、そのような memset への呼び出しは機能しますが、何もしません。初期化するバイト数が として指定されているため0です。

void bzero(void *s, size_t n)

このようなエラーは、bzero を使用することで回避できます。これは、関数プロトタイプが使用されている場合、2 つの引数を bzero にスワップすると、C コンパイラによって常にキャッチされるためです。

于 2013-12-23T06:08:08.807 に答える
2

要するに memset、より多くのアセンブリ操作が必要ですbzero

これはソースです: http://fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdown

于 2014-01-16T08:45:59.713 に答える
-1

memset は 3 つのパラメーターを取り、bzero はメモリ内で 2 つ取りますが、追加のパラメーターはさらに 4 バイト必要であり、ほとんどの場合、すべてを 0 に設定するために使用されます。

于 2019-07-23T17:20:07.233 に答える