2011-01-02 5 views
4

私は正確に4つのブール値を私の構造体にcで格納する必要があります。はい、私は4つの整数を使うことも、配列に入れることもできますが、もっとうまくやりたいです。私は "0000"のような整数について考えていましたが、各数値はブール値を表しますが、編集時には1桁の数字しか編集できません。それdoesntのは、あなたがビットフィールド構造体を使用することができより多くのブール値を格納する最も効果的な方法

+3

「有効」を定義します。最速を意味しますか?最小メモリ占有量?最小のコードフットプリント?最もエレガント? –

+0

「最も効果的」とは何ですか?より少ないメモリを使い、素早く簡単に使用できますか? – schnaader

+0

これを含めないと申し訳ありませんが、メモリの使用量が少なくて使いやすいことを意味します。 – tsusanka

答えて

17

...どちらか任意のアイデアを

感謝を完璧に仕上げる:

struct foo { 
    unsigned boolean1 : 1; 
    unsigned boolean2 : 1; 
    unsigned boolean3 : 1; 
    unsigned boolean4 : 1; 
}; 

あなたは、簡単に、たとえば、個別に各ブール値を編集することができます。

struct foo example; 
example.boolean1 = 1; 
example.boolean2 = 0; 
+1

参照:http://en.wikipedia .org/wiki/Bitfield – marcog

+1

偉大な、それは完璧に見えます。 Btw私はそれらの変数のそれぞれがちょうど1ビットを取ることを正しく得ますか? – tsusanka

+0

理論的には、はい。しかし、メモリパッディングが原因でもう少し多くなるでしょう。しかし、整数を使うというよりもメモリ効率が高いことは確かです。 – houbysoft

2

ビットフィールドを使用して "0000"のようなintを使用すると、実際にはかなり規則的に行われます。はい、bit shiftingを使用して1つの値を編集できます。個人的には、構造体を変更することなく最大32の値(32ビットintを使用している場合)を拡張することができるので、ビットフィールド構造体にintを使用したいと思います。

-1
struct _eMyBool 
{ 
    int m_iOne : 1; 
    int m_iTwo : 1; 
    int m_iThree : 1; 
    int m_iFour : 1; 
} eMyBool; 

しかしでも、それはboolean型を使用するための最も効率的な方法であると思ういけません。

これを処理するために生成された追加アセンブリコードは価格がかかります!

For example read this MSDN article

AFAIは、私は1ビットのalignementメンバーにアクセスするときbitshiftingためadditionnalコードのフットプリントは本当に重要であるので、得メモリの少なくとも7の比率があるはずだと思う覚えています。

This is the wikipedia article about data alignement.

+1

MSDNの記事は面白いですが、OPの定義では、「最も効果的」とは「メモリを使いにくく使いやすい」という意味です。ここでのトレードオフは、メモリではなく、CPU命令のほんの一部です。 – houbysoft

+0

私はあなたに同意する傾向がありますが、この価格は念頭に置いておく必要があります。おそらくこの記事ではないかもしれませんが、私は7の比率をはっきりと覚えています。私が非常に多くの記憶を得なければ、ビットフィールド法は本当に価格を持つかもしれないマイクロオプティマイゼーションです。ブール値の1つへのアクセスがアプリケーションをプロファイリングしている間に大いに反復する操作である場合、疑いなく私はビットフィールドを削除します。 –

1

あなたはこれらの何百万を保存している場合は、パックビットとしてそれを行います。

1秒間に何百万回もアクセスする必要がある場合は、int(またはshortsまたはchars)で指定します。

いずれにも該当しない場合は問題ありません。

両方の場合、パフォーマンスチューニングを行う必要があります。

関連する問題