私が疑問に思っていたのは、ほとんどの実装でcalloc
はサイズもアライメントとして扱い、サポートされている次の粒度に切り上げるのですか?
もしそうなら、それらは次の 2 の累乗に切り上げますか、それとも次の 8 または 16 の倍数に丸めますか?
パラメータを同じに保つ場合calloc
、それはどのように機能しますか? あなたのデータは整列されていませんか?
ありがとうございました!
私が疑問に思っていたのは、ほとんどの実装でcalloc
はサイズもアライメントとして扱い、サポートされている次の粒度に切り上げるのですか?
もしそうなら、それらは次の 2 の累乗に切り上げますか、それとも次の 8 または 16 の倍数に丸めますか?
パラメータを同じに保つ場合calloc
、それはどのように機能しますか? あなたのデータは整列されていませんか?
ありがとうございました!
sizeof
配列内のオブジェクトのサイズを生成するように定義されています。つまり、適切な位置合わせに必要なパディングがすでに考慮されています。したがってsizeof(foo)
、一部の object に対して が 23 の場合foo
、プロセッサはバイト境界で整列されている必要があります。(一方、23 を渡すのが妥当だと思って 23 を渡す場合は、幸運を祈ります。それは自己責任です。)
アライメントに関する限り、calloc(1000, 23)
は と正確に同等malloc(1000 * 23)
です。実装が何らかの方法でサイズを「調整」することを決定した場合、合計サイズが23000
より大きな実装定義の値にスナップされます。calloc
の 2 番目のパラメーター(または最初のパラメーター) に適用される特別な処理はありません。
にスナップ23
することは、 (合計サイズに関して) にスナップすることを意味します。アライメントのために全体を追加する必要がある合理的な実用的な実装はありません。24
calloc(1000, 23)
23000
24000
1000