我刚刚注意到gcc关于位域的一个有趣的特性。如果我创建如下的struct
:
template <int N>
struct C
{
unsigned long long data : N;
};
然后在amd64上:
带有-m64的
sizeof(C) == 8
; sizeof(C) == 4
,对于N ∊ ,sizeof(C) == 8
。 (带有
sizeof(unsigned long long) == 8
)。除了在我的系统上
uint_fastXX_t
之外,这似乎与C99/C++ 11 sizeof(uint_fast8_t) == 1
极为相似。但是例如,我无法重现与__int128
类似的东西(它始终会导致sizeof(C) == 16
)。在C++ 98中,使用前面提到的
struct
替代uint_fastXX_t
的“穷人”,对您来说似乎是个好主意吗? 最佳答案
否-位域通常比裸露的未经修饰的int
慢得多,因为如果您执行某些操作(例如加法或乘法)可能会溢出指定的大小,则编译器将(通常)将按位and
指令插入确保结果适合指定的大小。例如,如果您将两个10位数字相乘并将结果放在10位字段中,则乘法运算最多会产生20位数字,因此编译器通常会产生20位结果,请使用按位and
以获得结果的10个最低有效位。
关于c++ - 可以将位域用作“穷人”的快速整数类型吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12022299/