1

Aboolは C++ では 1 バイトを使用します。しかし、なぜ abool[8]は 1 バイトではなく 8 バイトを取るのでしょうか? 1 バイトには 8 ビット分のスペースがあります。

-Osフラグを使用してGCCでこれをコンパイルしました:

#include <iostream>

using namespace std;

class Foo
{
    public:
        bool m_bool[8];
};

int main ()
{
    cout << "Size: " << sizeof(Foo) << " byte(s) " << endl;

   return 0;
}

「サイズ:8バイト」を返します。

それを最適化する方法はありますか?

4

5 に答える 5

7

コンパイラは、個々の bool のアドレスを取得できるようにする必要があります。つまり、次のようなものです。

Foo foo;
bool* p = &foo.m_bool[0];
bool* q = &foo.m_bool[1];

ブール値がパックされている場合、p と q は何になりますか?

于 2012-08-31T03:32:28.810 に答える
2

まず bool のサイズが 1 であるとは限りません。2 つ目は、8 つをグループ化すると、結果が 1 になると予想されるのはなぜですか?

8×1=8

于 2012-08-31T02:25:32.367 に答える
1

上記のコメントで言及されていなかったので、「最適化する方法はありますか?」という質問に答えて概念について言及します。まだ使用していない場合に備えて。これはbitmaskingと呼ばれ、基本的にintを一連のビットとして使用し、ビットごとの演算子を使用して整数の個々のビットを評価します。

文字列のビットを適切に簡単に設定するために、意味的に名前が付けられ、2 のべき乗の値に設定されるいくつかの定数を定義するのが一般的です (1 ビットのみを「反転」するようにします。ビットシフト演算子を使用して簡単にどのビットが反転されているかを明らかにします。

#define IS_ADMIN = 1<<0;
#defing CLEAR_CACHE = 1<<1;

次に、次のように管理者をテストします。

if(userSettings & IS_ADMIN) { ...

これが出発点のwiki記事です

于 2012-08-31T02:29:30.390 に答える
0

「最適化する方法はありますか?」

最適化が有益であると確信していますか? ブール値の代わりに列挙型をフラグとして使用して、それらをすべて 1 バイトに格納できます。

C++で列挙型をフラグとして使用するには?

于 2012-08-31T02:29:39.307 に答える