4

「グッドプラクティス」とは何か、またはより「正しい」と見なされるものがわからない。配列があります。arrayname[]以外の名前で個々の要素にアクセスしたいと思います。#definesまたはpointersを使用できますが、おそらく他の方法も使用できます。

例:

#define value1 myarray[1]

int myarray[SIZE];
value1 = 5;

また

int myarray[SIZE];
int *ptr;
ptr = &myarray[1];
*ptr = 5;

#defineルートはより単純で、使用するメモリも少ないように思えますが、私が気付いていない多くの問題が発生する可能性があります。どんな洞察も素晴らしいでしょう。可能な限り、一般的に受け入れられている標準に従ってコードを維持したいと思います。

*編集:たぶん、もっと良い方法があります。私の最終目標は、周辺機器ポートから送信されるアレイを取得することです。ただし、データは非常に異なるデータセットで構成されており、単一の配列名は割り当てられているデータを表すものではありません。私のメモリはかなり限られているので、各値を二重に保存することは避けたいと思います。

4

6 に答える 6

5

例として、3番目のオプションを提案します。

#define VALUE1_IDX  1

int myarray[SIZE];
myarray[VALUE1_IDX] = 5;

#1に対するこれの利点は、myarrayを使用していることがまだ明らかであり、#2に対する利点は、あなたが言ったように、ポインターを回避することです。直感的に理解できるように見えますが、最適化を使用すると、オプション#2で余分なメモリ使用量が発生しないのではないかと思いますが、検証はしていません。

最善の解決策は状況によって異なると思います。適切な状況では、2つのオプションのいずれかを防御できると思います。

編集:Kevinのコメントをエコーするには、値をまとめて処理していないときに配列の使用を回避できるかどうかを最初に確認することも価値があります。長いメッセージを読んで、いくつかの重要な値を単純に引き出したい場合など、これが当てはまらない状況は確かにあると思います。

于 2012-12-14T20:49:12.380 に答える
2

なぜ参照しないのですか?

int A[3];  
int& a1=A[1];
于 2012-12-14T21:20:45.407 に答える
1

unionsは、変数をエイリアスするもう1つの方法です。ただし、これを推奨事項と見なさないでください。エイリアシングに依存している場合、それらは危険です(移植できません)。同時に必要のない変数については、メモリ使用量を最適化するためにのみ使用する必要があります。

于 2012-12-14T20:50:16.157 に答える
1
enum {SIZE = 100};

struct Mapping {
  int unused1;
  int value1;
  int unused2;
};

Mapping& AsMapping( int(&array)[SIZE] ) {
  return *reinterpret_cast<Mapping*>(&array);
}

int arr[SIZE];
AsMapping(arr).value1 = 5;
Mapping& values = AsMapping(arr);
values.value1 = 5;

これにはほとんどメモリが必要なく、オプティマイザはすべてを消去できるはずです。その間、それは合理的に維持可能です。

の配置を設定するstructことは、注意しなければならない要件かもしれません。

于 2012-12-14T21:49:07.880 に答える
0

あなたはこのようなことをすることができます

typedef enum
{
    foo = 0;
    // ... more named values
    bar = SIZE;
} Thing;

int value[SIZE];
value[foo] = 5;

列挙型を配列インデックスとして使用する

于 2012-12-14T21:00:16.480 に答える
0

non-defineメソッドを使用すると、2番目からは利用できない程度の型修正が可能になります。

さらに、正常なコンパイラによって生成される実際のコードは、両方で同じになります。

何が起こっているのかがすぐにわかるので、全体として2番目の方がいいと思います。もう1つのバグは、#defineが、実際に処理している領域の範囲外で問題を引き起こす可能性があることです。

後者を使用する方がはるかに賢明です。これは、他の誰かがやって来て、後でそれを台無しにする可能性が低いことを意味します...

于 2012-12-14T22:28:32.000 に答える