请考虑以下代码段:
#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中说:
类对象中位域的分配是 实现定义的。
也许我错过了一些东西,但我认为编译器处理这种情况的方式存在一些不一致。