我刚刚注意到gcc关于位域的一个有趣的特性。如果我创建如下的struct:

template <int N>
struct C
{
    unsigned long long data : N;
};

然后在amd64上:

带有-m64的
  • ,对于N ∊ ,sizeof(C) == 8;
  • 带有-m32的
  • ,对于N ∊ ,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/

    10-10 17:52
    查看更多