位字段可以用作"穷人"的快速整数类型吗?

Can bit-fields be used as a «poor man's» fast integer type?

本文关键字:整数 类型 穷人 字段      更新时间:2023-10-16

我刚刚注意到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)。

98 C++中,用前面提到的struct作为uint_fastXX_t的"穷人"替代品,对您来说似乎是一个好主意吗?

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

不是真的。在我们关心的大多数系统上,uint_fast32_tuint_least32_tuint32_t将是相同的类型。

例如,只有在异国情调的硬件上,快速/最小类型可能是 36 位,而不是 32 位。