现在我很好奇,[标志]实际使用位域的唯一方法是吗?
不,标志不是唯一使用位域的方法。它们也可以用于存储大于一位的值,尽管标志更为常见。例如:
typedef enum {
NORTH = 0,
EAST = 1,
SOUTH = 2,
WEST = 3
} directionValues;
struct {
unsigned int alice_dir : 2;
unsigned int bob_dir : 2;
} directions;
我们是否需要使用位字段来节省空间?
位字段确实可以节省空间。它们还提供了一种更简便的方法来设置非字节对齐的值。可以使用与设置中的字段相同的语法,而不是移位和使用按位运算struct。这提高了可读性。使用位域,您可以编写
directions.alice_dir = WEST
directions.bob_dir = SOUTH
但是,要在一个int没有位域的空间(一个或其他类型)中存储多个独立值,则需要编写如下内容:
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
可以说,提高位域的可读性比在这里和那里保存几个字节更为重要。
我们为什么要使用int?占用多少空间?
整个空间int被占用。我们使用int它是因为在很多情况下,它并不重要。如果对于单个值,您使用4个字节而不是1或2个字节,则用户可能不会注意到。对于某些平台,尺寸的确很重要多了,你可以使用占用空间少(其它数据类型char,short,uint8_t,等)。
据我了解,内存中仅占用1位,而不是整个unsigned int值。这是对的吗?
不,那是不正确的。unsigned int即使您仅使用其8位,整个对象也将存在。