关于"为什么我们需要使用位字段"的问题,我在谷歌上搜索发现位字段用于标记.

  1. Is it the only way bit-fields are used practically?
  2. Do we need to use bit fields to save space?

从书中定义位字段的方法:

struct {
    unsigned int is_keyword : 1; 
    unsigned int is_extern :  1; 
    unsigned int is_static : 1;
} flags;
  1. Why do we use int?
  2. How much space is occupied?

我搞不懂为什么我们用的是int,而不是short或小于int的东西.

  1. As I understand only 1 bit is occupied in memory, but not the whole unsigned int value. Is it correct?

推荐答案

Now I am curious, [are flags] the only way bit-fields are used practically?

不,标志不是使用位字段的唯一方式.它们也可用于存储大于一位的值,尽管标志更为常见.例如:

typedef enum {
    NORTH = 0,
    EAST = 1,
    SOUTH = 2,
    WEST = 3
} directionValues;

struct {
    unsigned int alice_dir : 2;
    unsigned int bob_dir : 2;
} directions;

Do we need to use bit fields to save space?

位字段确实节省了空间.它们还允许以一种更简单的方式设置不是字节对齐的值.我们可以使用与设置struct中的字段相同的语法,而不是进行位移位和使用位操作.这提高了可读性.使用位字段,您可以编写

directions.alice_dir = WEST;
directions.bob_dir = SOUTH;

但是,要在一个int(或其他类型)的空间中存储多个独立的值,而不使用位字段,您需要编写如下代码:

#define ALICE_OFFSET 0
#define BOB_OFFSET 2
directions &= ~(3<<ALICE_OFFSET); // clear Alice's bits
directions |= WEST<<ALICE_OFFSET; // set Alice's bits to WEST
directions &= ~(3<<BOB_OFFSET);   // clear Bob's bits
directions |= SOUTH<<BOB_OFFSET;  // set Bob's bits to SOUTH

可以说,提高位域的可读性比在各处节省几个字节更重要.

Why do we use int? How much space is occupied?

整个int的空间被占用了.我们使用int,因为在很多情况下,这并不重要.如果对于单个值,使用4字节而不是1或2字节,用户可能不会注意到.对于某些平台,大小确实更重要,您可以使用占用更少空间的其他数据类型(charshortuint8_t等).

As I understand only 1 bit is occupied in memory, but not the whole unsigned int value. Is it correct?

不,那是不对的.即使你只使用其中的8位,整个unsigned int位都将存在.

C++相关问答推荐

Linux/C:复制修剪了最后一个填零孔的文件

使用sd-设备列举设备导致seg错误

理解C中的指针定义

带双指针的2D数组

C指针算法在函数参数中的应用

GCC预处理宏和#杂注GCC展开

如何将字符串argv[]赋给C中的整型数组?

ATmega328P EEPROM未写入

C中的指针增量和减量(*--*++p)

将数据移动到寄存器时出现分段故障

Setenv在c编程中的用法?

如何使用C for Linux和Windows的标准输入与gdb/mi进行通信?

C-使用指针返回修改后的整数数组

为什么memcpy进入缓冲区和指向缓冲区的指针工作相同?

&;(str[i])和(&;str)[i]有什么区别?

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

将复合文字数组用作临时字符串缓冲区是否合理?

Matlab/Octave对conv2函数使用哪种方法?

变量值不正确的问题