我正在阅读Adam Drozdek撰写的“ C ++中的数据结构和算法第4版”一书,我遇到了以下代码。我的问题是结肠在unsigned int successor : 1;
中做了什么。
我找到了一个答案,说结肠使successor
只占一位。但我知道布尔变量需要多个字节,因为变量必须是可寻址的。如果successor
仅占用一位,那么它怎么可以寻址?
template<class T>
class ThreadedNode {
public:
ThreadedNode() {
left = right = 0;
}
ThreadedNode(const T& e, ThreadedNode *l = 0, ThreadedNode *r = 0) {
el = e; left = l; right = r; successor = 0;
}
T el;
ThreadedNode *left, *right;
unsigned int successor : 1;
};
答案 0 :(得分:1)
这被称为Bit Field。表达式unsigned int successor : 1;
声明一个名为unsigned int
的{{1}},您希望它只使用1位。
以需要使用比指定位数多的位的方式使用位字段的行为是实现定义的行为。它也不可能获得指向一个位字段的指针或非const引用,因为它们不一定从字节的开头开始。
位字段允许编译器在某些情况下通过将兼容的位字段打包在一起来减小类型的大小。位字段在减小尺寸方面是非约束性的,并且只是编译器的机会。