我刚刚注意到 gcc 在位域方面的一个有趣特性。如果我创建如下所示的 struct
:
template <int N>
struct C
{
unsigned long long data : N;
};
然后在 amd64 上:
- 使用 -m64,对于 N ∊ <1, 64>,
sizeof(C) == 8
; - -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
的“穷人”替代品对您来说是个好主意吗 ?
最佳答案
不——位域通常比裸露的、未修饰的int
慢,因为如果你做一些事情(例如,加法或乘法)可能溢出指定的大小,编译器将(通常)插入按位 and
指令以确保结果适合指定的大小。例如,如果将两个 10 位数字相乘并将结果放在 10 位字段中,乘法可能会产生最多 20 位数字,因此编译器通常会产生 20 位结果,使用按位 和
以获得结果的 10 个最低有效位。
关于c++ - 位域可以用作“穷人的”快速整数类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12022299/