0

memcpy や memset などのC関数は、iOS の #define と同様にC関数として使用できます。

たとえば、ボンネットの下の #define memcpy は次のとおりです。

#define memcpy(dest, src, len)                  \
((__darwin_obsz0 (dest) != (size_t) -1)             \
 ? __builtin___memcpy_chk (dest, src, len, __darwin_obsz0 (dest))   \
 : __inline_memcpy_chk (dest, src, len))
  1. ここでいくつかのメモリチェックがあると思いますが、誰かがmemcpyだけよりも優れている理由について追加の詳細を教えてもらえますか(付加価値はどこにありますか)?

  2. さらに重要なのは、いつどれを使用するか?

4

3 に答える 3

2

などの名前は__inline_memcpy_chk、コンパイラが の使用を最適化するために使用されますmemcpy。これらは、コンパイラの組み込み機能に対応する特別な名前です。の特定の使用法を、ライブラリ ルーチンmemcpyを呼び出すよりも高速なコードに変換するのに役立ちます。memcpyその結果、単純な移動命令になるか、さらに効率的にコンパイラー内の情報が単純に変更されるため、値のコピーがレジスターで使用可能であることがわかります。

これらの組み込み機能が使用されないようにマクロを定義解除するmemcpyと (C 標準で許可されています)、memcpyルーチンは引き続き機能しますが、そのままにしておく場合よりも効率が低下する可能性があります。

通常、これらの内部名を自分で呼び出そうとしないでください。これらは、 の通常の使用をmemcpy効率的にするために設計および定義されています。

于 2013-05-19T02:12:53.573 に答える