BohYoh.comトップページへ
C & C++ FAQ
目次

C C++ mallocに対するcallocのメリットは何ですか。

 calloc関数を使えば、構造体や共用体の内部に作られる“詰め物”のビットもすべて0になります。この“気持ちよさ”を得るためには、malloc関数でなく、calloc関数を使わなければなりません(笑)。

― すべてのビットが0になっても、浮動小数点数やポインタの値は0になるとは限らないですよね。それだったらmalloc関数で確保した後に0を代入すればいいのではないですか。

 まあ、そうもいえるでしょう。ここで、第1章に示した図を再びFig.7-5に示します。

 これは、int型が記憶域上に32ビットを占有していても、実際には28ビットしか使わない処理系もあり得る、ということを示すものでした。この整数に0を代入すると、確かに有効なビットの全ビットが0がとなります。
 しかし、未使用ビットにまで0が代入されるという保証がないことに注意しましょう。

重 要
 整数型オブジェクトの全ビットが0であれば、値も0である。しかし、値が0であるからといって全ビットが0であるという保証はない。

― なるほど。calloc関数による《ゼロ詰め》は、単に0を代入することでは得られない究極の“気持ちよさ”ですね。。

 もう一つcalloc関数の方が好ましい理由があります。よく知られた話ですが、処理系によっては、絶対値を求めるためのabs関数やlabs関数の呼出しを見つけると、関数を呼び出さずにインラインに展開して高速化を行います。すなわち、処理系はプログラムを文法規則通りに解釈するのではなく、それ以上のことを行う可能性があるのです。
 したがって、処理系によっては、calloc関数に与えた第2引数の型を見て、境界調整の問題も含め、その型に適した記憶域の確保を行う可能性があります。処理系に対して、確保するオブジェクトの型を知らせることは重要なことなのです。

重 要
 calloc関数の第2引数に与えられた式sizeof(Type)は、処理系に対して高速化や記憶域の節約のための大きなヒントとなる可能性がある。

引用:柴田望洋『秘伝C言語問答ポインタ編 第2版』,ソフトバンクパブリッシング,2001


■ 根拠 ■
標準C §7.10.3 Memory managemnet functions
標準C99 §7.20.3 Memory managemnet functions
標準C++ §20.4 Memory

■ 参照 ■
FAQ callocとmallocの違いは何ですか。

戻る

BohYoh.comロゴ