アプリ版:「スタンプのみでお礼する」機能のリリースについて

/*ネットの*/
w = (double **)malloc(sizeof(double*) * h);
w[0] = (double *)malloc(sizeof(double) * v * h);
for(i=0; i<h; i++) w[i] = w[0] + i *v;

/*自分の*/
w = (double **)calloc(h, sizeof(double *));
for(i = 0; i < h; i++){
w[i] = (double *)calloc(v, sizeof(double));

自分は初心者です。自分は下のようなコードで書いていたのですが
ネットで見つけたコードで上のようにデータの領域を全部確保してから
2番目以降のポインタを割り当てるようなやり方をしていました。
そのやり方は初めて見たのですが、こっちのほうが一般的なやり方なんでしょうか?
それと何かメリットはあるんでしょうか?
一度に確保した方が確実に連続領域に割り当てられるとかかなぁとか予想してるんですが・・・

A 回答 (6件)

私は上の方を使用しています。


その理由は、hが100だったとして、iが30の時にヒープが足りなくなってしまった場合に、エラー処理として既に確保済の30個はfreeで開放しなければなりませんが、上の方であれば、一回のmallocで100個分の全体が確保できるかできないかのどちらかです。従って既に確保済の部分だけを開放するという細かい操作が必要なくなります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
確かにそういうケースも考えられますね。とてもわかりやすいです。

お礼日時:2014/12/22 20:57

「2次元配列に値を代入するまでちょっと時間差があるので初期化されてた方が安心かな」ということだけど, もし本当にそんなことを言うようなら書き直しをさせそうな気がする. そもそも「時間差」なんて関係ないよね.



ちなみに, どのような値で「初期化」されるかわかっていますか? その値は適切ですか?

あと, 規格に従う限り sizeof(char) は必ず 1 です>#5. ただし, ぎりぎりいうと「アライメントをあわせるのにビットアンドを使うのが妥当か」というと困る.

アライメントまわりは「一昔前の 32ビットアドレスの RISC」なら (ほぼ) 必ず言及されることだったりするんで, どうしても気になっちゃうんだよね....
    • good
    • 0

Itaniumの32ビットモードだとアライメントの問題起こすのは確かです。

>#2

アライメントを考慮するなら

size_t siz = (sizeof(double *) * h + sizeof(double) - 1) & ~(sizeof(double) - 1);
w = (double **)malloc(siz + sizeof(double) * v * h);
w[0] = (double *)(((char *)w) + siz);
for (int i = 1; i < h; i++) {
w[i] = w[i - 1] + v;
}

になるのかなぁ。
sizeof(char)==1を期待してるのは、それはそれで問題なんだろうけど。
    • good
    • 0

#1 の方法だと


・double * は 4バイトかつ 4バイトアライン
・double は 8バイトかつ 8バイトアライン
という環境でかつ h が奇数のときに死にます. 今どきそんな環境があるかどうかは知りません (し将来的にそれに類似する環境が発生するかどうかもわかりません) が, かつてあったことも事実.

あと, calloc を使うことによる「安心感」がどのようなものか, 説明できますか? 説明できるなら calloc でも malloc でも好きな方を使えばいいですが, もし説明できないとしたら危ないかもしれませんよ.
    • good
    • 0
この回答へのお礼

なるほど...

正直callocについてはよくわかってないです。ただ2次元配列に値を代入するまで
ちょっと時間差があるので初期化されてた方が安心かなとよくわかってないながら思っただけです。
どう危ないか教えて頂けるとありがたいです。

お礼日時:2014/12/22 21:00

厳密にいうとそれはアライメントの問題を起こす余地があるような気がします>#1.



ところで, なんで calloc 使ってるの?
    • good
    • 0
この回答へのお礼

あんまり良くないということですか?
callocは特に意味はなかったです。なんとなく安心感があって使ってました。
mallocの方が良いですか?

お礼日時:2014/12/22 01:26

>それと何かメリットはあるんでしょうか?



malloc()といえど何らかの処理コストがありますし呼び出し回数が少ない方が処理時間は少なくなります(体感はできないでしょうけど)。
またヒープの管理領域分の節約にもなります。

でも更に突き詰めるなら

w = (double **)malloc(sizeof(double *) * h + sizeof(double) * v * h);
w[0] = (double *)(w + h);
for (int i = 1; i < h; i++) {
w[i] = w[i - 1] + v;
}

じゃないかなぁ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
勉強になります。

お礼日時:2014/12/22 01:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!