代码的输出如何变化? 我知道
struct-declarator:
declarator
type-specifier declarator opt : constant-expression
此处常量表达式以位为单位指定字段的宽度。
#include<stdio.h>
int main()
{
struct value{
int bit1 : 8;
int bit3 : 8;
int bit4 : 8;
}bit;
printf("%d\n",sizeof(bit));
return 0;
}
输出为4
#include<stdio.h>
int main()
{
struct value{
int bit1 : 1;
int bit3 : 4;
int bit4 : 4;
}bit;
printf("%d\n",sizeof(bit));
return 0;
}
输出 4
#include<stdio.h>
int main()
{
struct value{
int bit1 : 1;
int bit3 : 16;
int bit4 : 16;
}bit;
printf("%d\n",sizeof(bit));
return 0;
}
输出为8
据我所知,结构的大小是其中声明的所有数据类型的大小。
最佳答案
这是因为打包和字节对齐。检查structure alignment
检查 C-FAQ详情
这是为了“对齐”。许多处理器无法访问 2 字节和 4 字节的数量(例如整数和长整型),如果它们以各种方式塞满的话。
假设你有这样的结构:
struct {
char a[3];
short int b;
long int c;
char d[3];
};
现在,您可能认为应该可以像这样将此结构打包到内存中:
+-------+-------+-------+-------+
| a | b |
+-------+-------+-------+-------+
| b | c |
+-------+-------+-------+-------+
| c | d |
+-------+-------+-------+-------+
但是如果编译器这样安排它,处理器会容易得多:
+-------+-------+-------+
| a |
+-------+-------+-------+
| b |
+-------+-------+-------+-------+
| c |
+-------+-------+-------+-------+
| d |
+-------+-------+-------+
在 packed'' 版本中,请注意,对于您和我来说至少有一点点难以看到 b 和 c 字段是如何环绕的?简而言之,处理器也很难。因此,大多数编译器将
像这样填充“结构”(就像使用额外的、不可见的字段一样):
+-------+-------+-------+-------+
| a | pad1 |
+-------+-------+-------+-------+
| b | pad2 |
+-------+-------+-------+-------+
| c |
+-------+-------+-------+-------+
| d | pad3 |
+-------+-------+-------+-------+
同时检查这个 C-Faq
关于c++ - c++中的结构对齐和填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24383771/