pit-rayの備忘録

ゲームやソフトウェアの開発にて得た知識や制作活動の途中経過をまったり書いていくブログ。

malloc()+memset()とcalloc() ゼロクリアする場合における違い

今回は開発していて気になったことがあったのでググってみました。

言語はCです。

 

最初の記事にも書いたのですが、私自身、プログラミング歴が長いわけではないため、信憑性はかなり低いものとなっております。

ネットサーフィンの基本ですが、より意識して情報の取捨選択をお願いします。

 

 

 

まず、今回気になったことは

malloc()+memset()によるゼロクリアとcalloc()によるゼロクリアは何が違うのだろうか

ということです。

 

まず、それぞれの関数の定義等を見ていきましょう。

 

メモリ確保を行う関数。stdlib.hに定義されている。

定義:void *malloc(size_t size)

戻り値:確保したメモリの先頭アドレス

参考:malloc - Wikipedia

 

  • memset

指定したメモリブロックから指定したバイト数の範囲に指定した文字データを書き込む関数。string.hに定義されている。

つまりは、指定した範囲を指定した文字で埋める関数です。

今回はこの関数を利用して上記のmalloc関数で確保したメモリをmemset関数で初期化(ゼロクリア)するということです。(このことを以下malloc()+memset()と略す )

定義:void *memset(void *s, int c, size_t)

戻り値:sの先頭アドレス

参考:memset - Wikipedia

 

  • calloc

メモリの確保とその初期化(ゼロクリア)する関数。stdlib.hに定義されている。

これはmalloc関数にゼロクリア機能が付いたもの。

定義:void *calloc(size_t nelements, size_t bytes)

戻り値:確保したメモリの先頭アドレス

参考:malloc-関連する関数 - Wikipedia

 

ここでmemset()の初期化処理とcalloc()の初期化処理は何が違うのかということが気になったわけです。

その為、ググってみたところ、以下のようなページがありました。

c - Why malloc+memset is slower than calloc? - Stack Overflow

ここのAnswersに以下のように書かれていたため、高校生レベルの英語力である私が軽く適当に訳してみました。(weblioGoogle翻訳を使用)

 The short version: Always use calloc() instead of malloc()+memset(). In most cases, they will be the same. In some cases, calloc() will do less work because it can skip memset() entirely. In other cases, calloc() can even cheat and not allocate any memory! However, malloc()+memset() will always do the full amount of work.

 

 

要約文:常にmalloc()+memset()の代わりにcalloc()を使用してください。殆どの場合、それらは同じものとして機能するでしょう。場合によってはcalloc()は完全にmemset()をスキップし得るので、より少ない仕事をするでしょう。 (calloc()はmemset()の簡易版的な意味合いだろうか)他の場合では、calloc()は少しもメモリを割り当てることが出来ず、誤魔化すことすらあり得ます。しかしながら、malloc()+memset()は全ての仕事量をこなします。

 この訳は全く持って正しいものではないので、他サイトなどに転載しないようにご協力お願いします。ここでは大体の意味を掴むために訳しております。

 

つまり、memset()のほうがcalloc()よりも確実にゼロクリアを行うといった感じでしょうか。

 

しかし、上記の参考サイトの質問者が仰っている通り、calloc()のほうがmemset()+malloc()よりも高速らしいです。

この件に関しての記事がありました。

malloc+memsetとcallocの違いについて

 

私の記事よりも詳しく書かれています。

もう少し深いところを知りたい場合、是非アクセスしてみてください。

 

結果的に言いますと、どちらがイイとは言えません。

どちらもそれぞれメリット・デメリットがあるみたいです。

素人の私にしてみるとお腹一杯です...(;´Д`)

 

まとめると

Q -ゼロクリアするうえでのmemset()とcalloc()の違いは?

A -「確実性」memset() >calloc()

  「速度面」memset()<calloc()

といった感じでしょうか。

 

何かこの記事にご不明な点や変な個所がありましたら、コメントにて指摘して頂けると幸いです。また、私は初心者みたいなものなので、意見など書いていただけると助かります。

何度も言いますが...

あくまで備忘録であることをお忘れなく。

それではまたの機会に会いましょう。

☆。.:*:・'゜ヽ( ´ー`)ノ まったね~♪