6

ビットフィールドに関してgccの興味深いプロパティに気づきました。次のようなものを作成した場合struct

template <int N>
struct C
{
    unsigned long long data : N;
};

次に、amd64で:

  1. -m64の場合、 N∊ <1、64> 、sizeof(C) == 8;
  2. -m32の場合、 N∊ <1、32 >の場合、およびN∊ < 33、64 sizeof(C) == 4>の場合、sizeof(C) == 8

(とsizeof(unsigned long long) == 8)。

これは、私のシステム上にあるという事実を除けば、ほとんどC99 / C++11に似ているようです。しかし、たとえば、(常に結果として)に似たものを再現することはできません。uint_fastXX_tsizeof(uint_fast8_t) == 1__int128sizeof(C) == 16

C ++ 98structの「貧乏人」の代わりとして前述のものを使用することはあなたにとって良い考えのように思われますか?uint_fastXX_t

4

2 に答える 2

7

いいえ-指定されたサイズをオーバーフローintする可能性のある何か(加算や乗算など)を実行すると、コンパイラは(通常)ビット単位のand命令を挿入して、結果は指定されたサイズに収まります。たとえば、2つの10ビット数値を乗算して結果を10ビットフィールドに入力すると、乗算によって最大20ビットの数値が生成される可能性があるため、コンパイラは通常20ビットの結果を生成しますand。結果の最下位10ビットを取得します。

于 2012-08-18T21:23:34.110 に答える
3

あまり。ほとんどのシステムでは、、、、が気になりuint_fast32_t、同じタイプになります。uint_least32_tuint32_t

エキゾチックなハードウェアでのみ、高速/最小タイプは32ビットではなく36ビットになる可能性があります。

于 2012-08-18T21:28:34.180 に答える