4

私はこれについてしばらく読んでいますが、良い答えが見つかったかどうかはわかりません。

92 個の構造体の配列をセットアップしようとしています。これは固定長であり、事実上ルックアップ テーブルであるため変更されません。callocこれを行う最善の方法は、最初にメモリを割り当ててからデータをロードすることだと思いました。

callocしかし、いくつか読んだ後、多くの人がこれなしで、またはmallocこのように直接メモリを割り当てているのを見ます

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

私の最初の質問は、メモリを動的に割り当てる方が良いかどうかです。私の理解では、これがより良い解決策でした。特に、データが常に使用されるとは限らない場合。

2 番目の質問は、データの初期化に関するものです。を使用して構造体を初期化できることを読んだことがあります... = {....};が、コンパイラはそれを受け入れていません。

これが私がこれまでに持っているコードです:

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!"

         // ...
4

3 に答える 3

5

あなたのコードは Objective-C のように見えますが、正しいですか?

配列に含まれる要素の数がわかっている場合 (そしてそれが正常なプロセッサとオペレーティング システムである場合)、明示的に定義する方が常に簡単です。

配列を動的に割り当てるときはいつでも、何か問題が発生しないように保護する必要があります。これにより、コードが理解しにくくなります。

それが本当にルックアップ テーブルであり、すべての値がコンパイル時にわかっている場合は、次のように初期化できます。

struct {
    int a;
    int b;
} myStructDate[92] = { {1, 2}, {3, 4}, ... {181, 182}, {183, 184} };
于 2012-03-18T04:14:27.363 に答える
3

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

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

myStruct s = {1,2};
myData[0] = s;

これに関して標準が何を言っているのかよくわかりません。

于 2012-03-18T04:10:07.857 に答える
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 を介して) ヒープにいつメモリを割り当てるかについての経験則は、関数の外で使用する必要がある場合です。それ以外の場合は、スタック上で行う必要があります (ローカル変数を使用)。

于 2012-03-18T04:10:38.923 に答える