0

最近、同じunsigned shortを使用して、結果とIDの2つの値を格納するコードを作成しました。次に例を示します。

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);

構造体を使用して両方の値を保持する方がよいでしょうか、それともこのタイプのものは一般的/許容可能ですか?プログラムはすでに非常に多くのメモリを保存しているので、使用するメモリを減らす方法を見つけ始めたいと思いました。

4

8 に答える 8

13

ビットフィールド(ただし、本当にスペースを狭める必要がある場合、つまり組み込みシステムの場合のみ)?

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;
于 2009-12-03T16:13:56.633 に答える
7

メモリが信じられないほどタイトでない限り、私は構造体ルートに行きます。その方法ははるかに明確で、コードを保守しなければならない次の人にとっては簡単です。

M68000に32ビットのアドレスレジスタがあったのを思い出しましたが、実際に使用されたのはそのうちの24ビットだけでした。プログラマーは、他の8ビットに情報を格納するためにあらゆる種類の「最適化」を行いました。M68030のような後のバージョンのチップが32ビットすべてを使用したとき、少年は彼らの顔を赤くしました。

于 2009-12-03T16:12:44.920 に答える
2

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

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

于 2009-12-03T20:32:11.653 に答える
2

絶対にメモリの不足がない限り、2つの異なる変数を持つ構造を持つというより単純なアプローチを選択したいと思います。読みやすさが向上し、メンテナンスの手間が軽減されます。

于 2009-12-03T16:14:06.260 に答える
2

これがメモリ使用量を減らすことだけを目的として行われるのであれば、あなたはそれをすべきではないと私は信じています。コードをはるかに読みやすくする2つのショートを含む構造を使用することをお勧めします。これを実行することで節約できるメモリの量は、コードをより保守しやすくすることで得られるメリットと比較して非常に小さいものです。

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

于 2009-12-03T16:17:43.930 に答える
1

私の意見では、両方のショーツを1つのショーツに合わせるのは、構造体を使用するよりも作業が多く、エラーが発生しやすくなります。より少ないメモリを使用する必要がある場合は、構造体を使用してビットフィールドを指定できます。

struct myStruct {
int data:8;
int result:8;
};

コードの全体的な保守性を向上させながら、同じメモリ削減の結果を実現します。

于 2009-12-03T16:16:22.277 に答える
0

ビットフィールドを持つ構造体は、最も理解しやすい実装です。このアプローチを使用しない場合は、値のペアを16ビット値にパックおよびアンパックする十分に文書化された マクロのセットを使用できます。

于 2009-12-03T20:39:24.937 に答える
0

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

単純な整数データポイントのセットがあるが、それらを削除したり無効とマークしたりできるとします。MSBを使用して「使用しない」というフラグを立てるだけで、アルゴリズムに追加する必要があるのは

if ( item > 0 )
   item += blah

ただし、構造体がある場合は、算術のすべてのビットにメンバーアクセスが必要になります

if ( item.valid() ) 
   item.setValue(item.getValue() + blah);
于 2009-12-03T20:47:15.663 に答える