質問

私は最近、例えば、2つの値の結果とIDを格納するために、同じ符号なしshortを使用するいくつかのコードを書いた:

unsigned short data = new_id();
// result is either 0 or 1 so store it in the rightmost bit and move the id left
data = (data << 1) + get_result();
// ... later ...
// now we can print results like
printf("%u: %u\n", data & 1, data >> 1);

それだけで両方の値を保持するための構造体を使用した方がよいか許容/共通点、このタイプのですか?このプログラムは、すでに私はそれが最大使用メモリを減少させる方法を見つけるために開始しようと思いましたので、多くのメモリを格納します。

役に立ちましたか?

解決

ビットフィールドの(しかし、あなたが本当にスペースにタイトにする必要がある場合にのみ、 - つまり、組み込みシステム)?

typedef struct id_result {
    unsigned int id : 15;
    unsigned int result : 1;
} id_result;

それ以外の場合は、はい、より完全かつ有意義な定義と構造体を使用します:

typedef uint16 IDTYPE; /* assuming uint16 exists elsewhere */

typedef struct id_result {
    IDTYPE id;
    bool result;
} id_result;

他のヒント

メモリが非常にタイトでない限り、

、私は、構造体のルートを行くだろう。それはあなたのコードを維持するために持って次の人のための多くのそのように明確かつ簡単です。

私は、M68000は、32ビットのアドレスレジスタを持っていたが、そのうちの24ビットのみが実際に使用された時のことを思い出しています。プログラマは、これらの他の8ビットの情報を格納するための「最適化」のすべてのソートを行いました。少年、その面はチップのそれ以降のバージョンは、M68030のように、すべての32ビットを使用した場合、赤色であった。

絶対にメモリのクランチがない限り、私はむしろ、二つの異なる変数と構造を持つ単純なアプローチのために行くだろう。これは、読みやすさを向上させ、メンテナンス作業を軽減します。

これはメモリ使用量を低減する目的のためだけに行われている場合、私はあなたがそれを行うべきではないと考えています。あなたははるかに読みやすいコードになります2つのショートパンツとの構造を利用したほうが良いです。あなたはコードがより保守することによって得るメリットに比べて非常に小さなこれを行うことにより、保存したメモリの量。

私はあなたが最初に任意のメモリリークがあるかどうかを調べるか、誰かが不必要など、メモリの大きなチャンクを割り当て、その後、その問題を解決しようとされているかどうかをするためにシステムをプロファイリングお勧めします。まだあなたが解決策を見つけることができない場合は、メモリの大部分を占め、そのメモリ割り当てモデルを再設計してみてください、あなたのプログラムのどの部分を見つけるます。

ビットフィールドでメモリを節約に対して助言する方へ:年が行くと、コンピュータがより多くのギガバイトを得るよう、L1 $(高速メモリは)わずか数十キロバイトのまま。ほとんどのアプリケーションで、今日のために、時間の大半は低速メモリは、L1 $に到着するのを待って費やされています。

遅いメモリが実際に大幅にアプリケーションの速度を上げることができますビットフィールドでメモリを節約し、ほとんどのアプリケーションのボトルネックであるので。これは20年前のように真実ではありませんでした。

単一の短い自分自身の中に両方のショートパンツをフィッティングすることで、私の意見では、より多くの仕事と構造体を使用するよりもエラーが発生しやすいです。少ないメモリを使用することが本当に必要とされている場合は、構造体にビットフィールドを指定することができます:

struct myStruct {
int data:8;
int result:8;
};
コードの全体的な保守性を増加させながら

これは、同一のメモリ低減の結果を達成する。

ビットフィールドを持つ構造体は最も理解しやすい実装されています。あなたがそのアプローチを使用しない場合は、のよく文書ののマクロのそのパックのセットを使用してにし、16ビット値のうち、値のペアを解凍できます。

構造体/オブジェクトを使用すると、必ずしも最善のか明確なアプローチではありません。

あなたは単に「使用しない」などのフラグにMSBを使用する場合は、

、あなたは単純な整数データポイントのセットがあるとしたが、彼らは削除または無効とマークすることができ、あなたは、アルゴリズムに追加する必要があるすべては

if ( item > 0 )
   item += blah
あなたは構造体を持っている場合は、

しかし、その後arithmaticのすべてのビットは現在、メンバーへのアクセスを必要とします。

if ( item.valid() ) 
   item.setValue(item.getValue() + blah);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top