個別の引数を持つことの利点の1つは、整数のオーバーフローを自動的に防ぐことです。
// On a 32-bit system, the calloc will almost certainly fail, but the malloc
// will succeed to overflow, likely leading to crashes and/or security holes
// (e.g. if the number of items to allocate came from an untrusted source)
void *a = calloc(64, 67108865); // 2^32/64 + 1
void *b = malloc(64 * 67108865); // will allocate 64 bytes on 32-bit systems
大規模な割り当ての場合、実装はヒープの内部知識を使用して不要な作業を回避したり、キャッシュパフォーマンスを向上させたりできるため、との組み合わせのcalloc
代わりに実行することでパフォーマンス上の利点が得られる場合もあります。malloc
memset
calloc
たとえば、アロケータが、mmap(2)
またはVirtualAlloc
より多くの仮想アドレス空間を取得するなどのOS機能を使用することを決定した場合、セキュリティ上の理由から、そのメモリは事前にゼロ調整されます。詳細な説明については、この質問を参照してください。割り当てが少ない場合、大きな違いに気付くことはほとんどありません。
一部の実装は内部でcalloc
呼び出すだけなので、オーバーフローチェックの可能性以外に利点はありません。malloc
memset