0

2つの質問があります:

このコード:

   struct employee
   {
      char name[20];
      int married :1;
   };

既婚者は何人記憶を取りますか?

また、ビットサイズのフィールドが複数ある場合は、それらを同じ変数に入れて個別に保持するのは良いですか?

お気に入り:

struct employee
{
 char name[31];
 int married :1;
 int manager :2;
 int children :4;
};

または

struct employee
{
 char name[31];
 int flage; /* one bit for married, one for manager, and 4 bits for children */
};

どちらがメモリ使用量に優れているのか、そしてその理由は何ですか?

4

4 に答える 4

5

既婚者は何人記憶を取りますか?

int : 1のストレージユニットで1ビットのメモリを使用しますsizeof(int)int符号付きでビットフィールドにはビットが1つしかないため、このようなビットフィールドは-1と0の2つの値しか取ることができないことに注意してください。

于 2012-09-09T11:24:11.253 に答える
3

それはコンパイラーに依存し、おそらくビルド時にコンパイラーに与えるオプションにも依存します。

フィールドを密にパックすると、ストレージ効率を上げながらアクセスパフォーマンスが低下する可能性があります。そのため、たとえばコンパイラに速度を最適化するように指示すると、フィールドが変更される可能性があります。

CHAR_BITSビットフィールドがメモリ内のビット未満を占めることはありません。そうしないと、各structインスタンスの開始アドレスが正確なアドレスに分類されcharないためです。

したがって、最初の例:

struct employee
{
    char name[20];
    int married :1;
};

システム上でが4であると仮定すると、おそらくsizeof (struct employee)24バイトを占めることを意味します。sizeof (int)これは、の後にビットフィールドメンバーを追加した場合married、31ビットのフィールドを追加するまでサイズは変更されないことを意味します。

于 2012-09-09T11:20:26.910 に答える
2

int flage既婚のマネージャーと子供に関する情報を格納するために使用する場合、1つのオブジェクトに2バイトのメモリが必要になる場合があり、特定の情報にアクセスする必要があるたびに、変数に対してビット演算を実行する必要があります。flageしたがって、これにはある程度の処理が必要になります。

int married:1;(より適切に使用する)のようなビットフィールドを使用することにより、1バイトのメモリunsigned intしか使用できないことを意味します。したがって、メモリを節約できます(構造体が埋め込まれていない場合)。ボーナスとして、そのビットに直接アクセスできます。

したがって、メモリと処理に関してはより良いアプローチになるはずです。

于 2012-09-09T12:25:31.907 に答える
1

読みやすく、コーディングの意図を最も正確に捉えているものを選択してください。このマイクロ最適化の話は完全に場違いです。パフォーマンスが重要な内部ループにいる場合は重要になる可能性がありますが、アルゴリズム、CPUのキャッシュパフォーマンス、ループ展開、ループパイプラインなどの他の手法が影響します。

繰り返しになりますが、コードを読む人のためのコードです。

次のようなことを検討することもできます。

struct employee
{
    char name[31];
    bool married;
    enum manager_t manager;
    ...
};

boolここで、 (たとえば)をに割り当てようとすると、コンパイラは警告を表示しますemployee::manager

于 2012-09-09T11:34:59.170 に答える