2012-03-11 13 views
0

私はGame of Life by John Conwayの3次元Cの実装を書いています。さて、コードをエラーに対して安全にしたいと思っています。 This yolinux.comの記事によると、安全なコードを書く。毎回割り当てエラーを本当にチェックしますか?

メモリ割り当てのエラーをチェックします。割り当てられなかった場合は解放できません。

私の質問は、本当に割り当てエラーが毎回確認する必要がありますか?それは私のコードを大幅に遅くする可能性があります。

inline int golField_Init(golField* field, golAllocProc alloc, 
         golOptions options, uint dimx, uint dimy, uint dimz) { 
    field->dimx = dimx; 
    field->dimy = dimy; 
    field->dimz = dimz; 
    field->cells = alloc(sizeof(golCell**) * dimx); 
    field->options = options; 

    if (!field->cells) return 1; 

    int x, y, z; 
    for (x = 0; x < dimx; ++x) { 
     field->cells[x] = alloc(sizeof(golCell*) * dimy); 
     for (y = 0; y < dimy; ++y) { 
      field->cells[x][y] = alloc(sizeof(golCell) * dimz); 
      for (z = 0; z < dimz; ++z) { 
       golCell_Init(&field->cells[x][y][z], 0); 
      } 
     } 
    } 

    return 0; 
} 

私は本当にそれぞれの配分に割り当てエラーをチェックする必要があります。ここでは抜粋ですか?それは既に割り当てられたストレージを解放する必要もあります。

+3

ポインタがNULLであるかどうかをチェックする、高速に疑いの余地あるヌルポインタ、メモリリークなどへのアクセス:そう、いくつかの負の側面のいずれかになるに失敗

現代のCPU –

+2

提案 - すべての行/列に対して1つの配列割り当てを行う必要がないように、単一の配列割り当てを行うことを検討することができます。それは "field-> cells = malloc(sizeof(golCell)* dimx * dimy * dimz)" – selbie

+0

selbie:それはn次元でしようとしたときにやったことですが、それは複雑になりました。次に、私は上から "3d code"を思いついてから、答えを読んだ後、3d配列を作成するのにちょっと複雑な方法で3つのステップでストレージを割り当てていました。 、ha。 xD擬似3d配列のアクセスと要素を線形にマップする方法を探している人のために:#define GOL_3DTOLINEAR(x、y、z、dx、dy、dz)((z)+((y)*(dz) )+((x)*(dz)*(dy))) ' –

答えて

3

コードの処理速度が極端に低下することはありません。はい、割り当てることができない場合はすべての割り当てをチェックして、優雅に終了してください。

はい、割り当てたメモリを解放する必要があります。あなたは割り当て、ガベージコレクタと例外を除いて、使用言語についてあまり考えていませんしたい場合はC :)

へようこそ。まず、自分でメモリを解放しないことができます。 2番目のオプションは、メモリを割り当てることができない場合(たとえば、メモリがオプションのコードの一部に割り当てられているため)、1つの場所にすべてのエラーをキャッチすることができます。私は実際に各配分に割り当てエラーをチェックする必要があり

2

はい、そうです。また、すでに割り当てられたストレージを解放するために私を必要とする

いいえ、エラーをチェックするかどうかにかかわらず、どのような場合でもこれを行う必要があります。

パフォーマンス低下が懸念される場合は、内部ループの外部でメモリ管理を行います。初期化関数でこれをやっているので、問題はありません。エラーチェック自体はメモリアロケータを呼び出すコストに比べて非常に安いです。

+0

この実装の中で、ループの外部でメモリ管理をどのように実装すればよいですか?ありがとう。 –

+0

@NiklasR:関数の名前が '_Init'で終わっているので、私は既にそれがあなたの処理ループの外にあると仮定します。しかし、ポインタの配列の代わりに単一の配列を割り当てることで、エラー処理を単純化し、プログラムを高速化することができます。 –

1

短い答え:絶対にYES

長い答え:

例えば、一度に必要なメモリを割り当てることができ、あなたがあなたを実装しているものに応じて...良いだろうかに関するperofrmanceなど

ただし、割り当てエラーの場合は常にチェックし、割り当てられた内容は常に無料です(オンリーワン!)。 - 原料不安定で脆弱なソフトウェアがで作られてい...

+0

私はストレージを一度に割り当てるという考えが好きです。ちょうど私がアクセスしたい3-Dセルの線形インデックスを計算する必要なしにそれを実装する方法を考える。私は '' cells [10] 'のような" 3d array "にはアクセスしたくありません。 –

関連する問題