2012-03-18 22 views
4

私はこれについてしばらく読んできましたが、私は良い答えを見つけたのかどうかはわかりません。Objective-Cで構造体の配列を初期化

92個の構造体の配列を設定しようとしています。これは固定長であり、実質的にルックアップテーブルであるため変更されません。私はこれを行う最善の方法は、最初にcallocとメモリを割り当てて、その後、データを読み込むことだと思った。

しかし、いくつか読んだ後、私はこのように多くの人がcallocmallocせずに直接メモリを割り当てる参照

myStruct myData[92] = { {1,2}, {3,4}, ....}; 

私の最初の質問は、動的にメモリを割り当てることが優れているかどうか?私の理解は、これがより良い解決策であるということでした。特にデータが必ずしも常に使用されるとは限りません。

私の2番目の質問は、データを初期化することです。私は... = {....};を使って構造体を初期化できますが、コンパイラはそれを受け入れていないと読んでいました。質問1について

typedef struct { 
    int a; 
    int b; 
} myStruct; 

@implementation MyClass 

    static myStruct *myData; 

    -(id) init { 
     // ... 

     myData = (myStruct *) calloc(92, sizeof(myStruct)); 
     myData[0] = {1,2}; // <=== Error ! Compiler says "Expected expression!" 

     // ... 
+2

MYDATA [0] = ...、代入ではありません初期化。残念ながら、初期化構文は割り当てに使用できません。 –

+2

スタティック割り当てが可能な場合にダイナミックアロケーションを使用するのはなぜですか? 'static myStruct myData [92]' – Lalaland

+1

私が理解しようとしていることの一つです。私は、静的なものが固定されているような未知のものに対して動的な処理を行う方がよいと推測します。だから、私の最初のコードは、ダイナミックだったのは静的でなければならないのですが、それは(相対的に言えば)大きかったのですが? – drekka

答えて

5

コードはObjective-Cと似ていますが、それは正しいですか?

アレイ内にいくつの要素があるか(そして正常なプロセッサとオペレーティングシステムであることが分かっている場合)、明示的に定義する方が簡単です。

あなたが動的に配列を割り当てるときは、間違ったことを防ぐ必要があります。そのため、コードを理解しづらくなります。

それは本当にルックアップテーブルである場合は、は、すべての値がコンパイル時に知られている、あなたはそれを初期化することができます

struct { 
    int a; 
    int b; 
} myStructDate[92] = { {1, 2}, {3, 4}, ... {181, 182}, {183, 184} }; 
+1

そして、値が一定であれば、配列全体を 'const'とマークし、プログラムの読み取り専用 'テキスト'セクションに追加されます。 –

3

:ここ

は、私がこれまで持っているコードで静的配列を割り当てることだけで問題ないはずです。この配列は、バイナリのデータセクションに格納され、プロセスの仮想メモリにロードされ、必要に応じて、プロセスが使用している他のメモリと同様にOSによってスワップアウトされます。また、データを割り当てるときや初期化する必要がないので、データにアクセスするときの時間も節約できます。

質問2について:gccは少なくともそのような配列要素を初期化するのは好きではありません。しかし、あなたは一時変数を使用して不正行為をすることができます:

私は、これについて標準が何を言っているのか分かりません。

2

これはあなたが割り当てまた、あなたの配列を設定し、この例のように、それを初期化するときは、{}の初期化を使用することができます

myData[0].a = 1; 
myData[0].b = 2; 

を行う必要があります初期化ではありませんので。上記の方法を使用する場合は、一時変数が不要なので、これは少し無駄です。あなたは、関数の外でそれを使用する必要がある場合

myStruct temp = {1,2}; 
myStruct* myData = (myStruct *) calloc(92, sizeof(myStruct)); 
myData[0] = temp; 

(malloc関数/のcalloc経由)ヒープ上にメモリを割り当てる際程度親指の良いルールがあります。それ以外の場合は、おそらくスタック上で(ローカル変数を使って)それを行うべきです。