Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有4个6位成员的结构的大小_C++_Struct_Bit_Sizeof - Fatal编程技术网

C++ 具有4个6位成员的结构的大小

C++ 具有4个6位成员的结构的大小,c++,struct,bit,sizeof,C++,Struct,Bit,Sizeof,为什么这个代码是: #include <iostream> struct S { unsigned char a:6, b:6, c:6, d:6; }; int main(int argc, char *argv[]) { std::cout << sizeof(S); return 0; } struct S { unsigned char a:4, b:4, c:4, d:4; }; 返回一个2,而这个: struct S { u

为什么这个代码是:

#include <iostream>
struct S {
    unsigned char a:6, b:6, c:6, d:6;
};
    int main(int argc, char *argv[]) {
    std::cout << sizeof(S);
    return 0;
}
struct S { unsigned char a:4, b:4, c:4, d:4; };
返回一个2,而这个:

struct S { unsigned char a:4, b:4, c:4, d:4, e:4, f:4; };
从以下位置返回3…

位字段的以下属性由实现定义:

[...] 关于类对象中位字段的实际分配细节的所有信息

例如,在某些平台上,位字段不跨字节,在其他平台上则跨字节 是的,它是由实现定义的,也就是说,由编译器决定

因此,即使编译器计算其他2个不带填充的值,它也会添加填充第一个值

是的,因为在第一种情况下,如果没有填充值,值将跨越字节边界,而在另外两个示例中,值不会跨越字节边界


同样,这是实现定义的,可以在另一个平台、同一平台上的不同编译器、甚至同一编译器的不同版本上进行不同的处理。

@YSC好吧,我不知道如何表达这个问题。我去那边看看。谢谢。位字段不能保证成员的大小与您提供的位数完全一致。类型的大小也不能限制为其成员的总和。@YSC所以,答案是-这取决于编译器?@FrançoisAndrieux所以,即使编译器计算其他2个而不填充,它也会添加填充第一个?@下划线\d您应该投票以该重复项结束,因此,如果这个问题结束,它将包含在副本中。这正是我在那里读到的内容,但在测试时发现类似的例子给出了不同的结果,这让我感到困惑。谢谢