我刚刚注意到gcc关于位字段的一个有趣属性。如果我创建struct
,如下所示:
template <int N>
struct C
{
unsigned long long data : N;
};
然后在amd64:
sizeof(C) == 8
; sizeof(C) == 4
和对于Nε&lt; 33,64&gt;,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
似乎是个好主意吗?< / p>
答案 0 :(得分:7)
否 - 一个位字段通常会比一个简单的,未校对的int
明显慢,因为如果你做某些事情(例如,加法或乘法)可能会溢出指定的大小,编译器将(通常)插入按位and
指令以确保结果符合指定的大小。例如,如果将两个10位数相乘并将结果放在一个10位字段中,则乘法可能产生最多20位数,因此编译器通常会产生20位结果,使用按位{ {1}}获取结果的10个最低有效位。
答案 1 :(得分:3)
不是真的。在我们关注的大多数系统上,uint_fast32_t
,uint_least32_t
和uint32_t
属于同一类型。
仅在exotic hardware上,快/最小类型可能是36位,例如,而不是32位。