c++ - 位域可以用作“穷人的”快速整数类型吗?

标签 c++

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

在 C++98 中使用前面提到的 struct 作为 uint_fastXX_t 的“穷人”替代品对您来说是个好主意吗 ?

最佳答案

不——位域通常比裸露的、未修饰的int,因为如果你做一些事情(例如,加法或乘法)可能溢出指定的大小,编译器将(通常)插入按位 and 指令以确保结果适合指定的大小。例如,如果将两个 10 位数字相乘并将结果放在 10 位字段中,乘法可能会产生最多 20 位数字,因此编译器通常会产生 20 位结果,使用按位 以获得结果的 10 个最低有效位。

关于c++ - 位域可以用作“穷人的”快速整数类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12022299/

相关文章:

c++ - 具有不同消息大小的多播性能

c++ - UART 上的串行数据被损坏

c++ - 写入多个文件描述符

C++构造函数初始化引用赋值

c++ - volatile sig_atomic_t 的内存安全

适用于 OS X 的 C++ IDE

c++ - 没有散​​列的无序映射

c++ - 重载运算符 == 和 != : compiler moans ambiguity

c++ - 从 void* 到 char* 的转换

c++ - 在资源中连接定义和字符串