我试图理解[class.bit] / 1,但我发现了这种奇怪的行为

时间:2017-04-03 20:01:15

标签: c++ language-lawyer bit-fields

请考虑以下代码段:

#include<iostream>
struct S {
    int bf1:16, bf2:7;
    char bf3:8;
} s;

struct A{
    int i;
    char c;
};

int main() {
    std::cout << sizeof(S) << '\n';
    std::cout << sizeof(A) << '\n';
}

clang和GCC为上面的代码打印以下值(请参阅only section):

4
8

也就是说,它分配了位字段bf3,好像我已经定义了struct S,如下所示:

struct S{
    int bf1:16, bf2:7, bf3:8
};

这似乎不正确。

另请注意,如果我使用9位定义位字段bf3,则在原始代码段中,两个编译器都会发出警告,指出9位超出其类型的宽度,{{1}但是现在它们为结构S打印了8个字节。这很奇怪,因为它仍然可以分配9位,就像在第一个char中声明bf3一样结构的成员。

我知道标准在live example中说:

  

类对象中位域的分配是   实现定义的。

也许我错过了一些东西,但我认为编译器处理这种情况的方式存在一些不一致。

0 个答案:

没有答案