关于C++中的int:0有什么特殊之处?

4
struct S {
    char a;         // location #1
    int b:5,        // location #2
    int c:11,
    int :0,         // note: :0 is "special"
    int d:8;        // location #3
    struct {int ee:8;} e;   // location #4
};

似乎结构体的 int :0 成员变量不占用任何内存空间,并且标记为://注意: :0 是"特殊的"

有人知道这里 int :0 的特殊用途吗?谢谢

PS: 代码示例引自http://www.stroustrup.com/C++11FAQ.html#memory-model


你知道什么是位域吗?如果你知道,那么我不清楚你在问什么。一个有0个位的位域显然不会占用任何空间,给它命名也没有意义。 - Max Langhof
3个回答

9

int:0; 声明了一个零宽度的位域。

它不占用内存,但明确地将其之前声明的位域和之后声明的位域分开放置在不同的内存位置。

这样可能会在结构体中引入填充,但这对于并发访问非常重要。

在您的示例中,bc 占用相同的内存位置,因此不能让一个线程访问 b,另一个线程访问 c。然而,零宽度位域确保了 d 是一个独立的内存位置,所以可以在不需要同步的情况下从不同的线程并发访问 bd

如果没有零宽度位域,在32位或64位平台上,编译器很可能会将 bcd 都作为同一机器字来处理,因此除非使用特殊指令,否则不能安全地进行并发访问;而有了零宽度位域,编译器将确保它们存储在单独的机器字中,或者使用适当的指令确保并发访问的安全。


4

1

引用自原始C++标准(ISO/IEC 14882,第一版1998-09-01,第9.6节“位域”[class.bit]第2段):

作为特例,宽度为零的未命名位域指定将下一个位域对齐到分配单元边界。仅在声明未命名位域时,常量表达式可以是等于零的值。

上述最后提到的常量表达式是位域的宽度。

迄今为止,每个后续的C++标准(和草案)都有相同的措辞。这可能至少部分解释了0是“特殊”的注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接