比特字段可以用作“穷人”的快速整数类型吗?

时间:2012-08-18 21:12:48

标签: c++

我刚刚注意到gcc关于位字段的一个有趣属性。如果我创建struct,如下所示:

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

然后在amd64:

  1. -m64 ,对于Nε&lt; 1,64&gt;,sizeof(C) == 8;
  2. -m32 ,对于Nε&lt; 1,32&gt;,sizeof(C) == 4和对于Nε&lt; 33,64&gt;,sizeof(C) == 8
  3. sizeof(unsigned long long) == 8)。

    似乎 似乎与C99 / C ++ 11 uint_fastXX_t相似,只是在我的系统sizeof(uint_fast8_t) == 1上。但是,例如,我无法复制与__int128类似的任何内容(总是会产生sizeof(C) == 16)。

    在C ++ 98 中使用前面提到的struct作为“穷人”替换uint_fastXX_t 似乎是个好主意吗?< / p>

2 个答案:

答案 0 :(得分:7)

否 - 一个位字段通常会比一个简单的,未校对的int明显,因为如果你做某些事情(例如,加法或乘法)可能会溢出指定的大小,编译器将(通常)插入按位and指令以确保结果符合指定的大小。例如,如果将两个10位数相乘并将结果放在一个10位字段中,则乘法可能产生最多20位数,因此编译器通常会产生20位结果,使用按位{ {1}}获取结果的10个最低有效位。

答案 1 :(得分:3)

不是真的。在我们关注的大多数系统上,uint_fast32_tuint_least32_tuint32_t属于同一类型。

仅在exotic hardware上,快/最小类型可能是36位,例如,而不是32位。