位字段可以用作"穷人"的快速整数类型吗?
Can bit-fields be used as a «poor man's» fast integer type?
我刚刚注意到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
)。
在98 C++中,用前面提到的struct
作为uint_fastXX_t
的"穷人"替代品,对您来说似乎是一个好主意吗?
不 -- 位域通常比裸露的、朴素的int
慢得多,因为如果您执行某些操作(例如,加法或乘法)可能会溢出指定大小,编译器将(通常)插入按位and
指令,以确保结果适合指定的大小。 例如,如果将两个 10 位数字相乘并将结果放在 10 位字段中, 乘法最多可以产生 20 位数字,因此编译器通常会生成 20 位结果,使用按位and
来获取结果的 10 个最低有效位。
不是真的。在我们关心的大多数系统上,uint_fast32_t
、uint_least32_t
和uint32_t
将是相同的类型。
例如,只有在异国情调的硬件上,快速/最小类型可能是 36 位,而不是 32 位。
相关文章:
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 涉及旧式枚举和整数类型的重载解析
- 将字符串转换为整数类型T,检查是否存在溢出
- 整数文本太大,无法用任何整数类型表示--C++
- isdigit(c) - 字符或整数类型?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- C++模板专用化 - 将其他整数类型委托给uint64_t
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 根据浮点数选择最小整数类型
- 为什么 QVariant 将字符类型视为整数类型
- 我们可以在整数类型的双指针中分配2D整数数组的地址吗?怎么可能
- 默认情况下,决定整数类型是唱歌或无符号的类型
- 是否可以根据类型是整数类型还是浮点类型重载模板函数
- 使用固定整数类型的安全性
- 如何使用条件来检查类型名 T 是否是 C++ 中浮点类型的整数类型
- C++文本整数类型
- 哪种整数类型可以安全且便携式用于始终保持指针值
- 检测整数类型变量上的空白输入
- 为什么对Chrono :: Nanseconds的表示类型是签名的整数类型
- 如何处理警告:从较小的整数类型int转换为int*