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>,sizeof(C) == 4对于 N ∊ <33, 64> sizeof(C) == 8,.

(与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

4

2 回答 2

7

不——位域通常会比裸露的、未修饰的int得多,因为如果您执行的操作(例如,加法或乘法)可能会溢出指定大小,编译器将(通常)插入按位and指令以确保结果适合指定的大小。例如,如果您将两个 10 位数字相乘并将结果放在一个 10 位字段中,则乘法可能会产生最多 20 位的数字,因此编译器通常会产生 20 位的结果,使用按and位获取结果的 10 个最低有效位。

于 2012-08-18T21:23:34.110 回答
3

并不真地。在我们关心的大多数系统上uint_fast32_tuint_least32_t、 和uint32_t将是同一类型。

例如,仅在外来硬件上,快速/最少类型可能是 36 位,而不是 32 位。

于 2012-08-18T21:28:34.180 回答