C sizeof(结构)不在填充之后
考虑一下C sizeof(结构)不在填充之后,c,struct,structure,sizeof,C,Struct,Structure,Sizeof,考虑一下 #include<stdio.h> struct outside1 { int a; char b; char c; char d[3]; }; struct outside2 { char a,b,A[2]; char B[2]; }; int main() { printf("%zu %zu\n",sizeof(struct outside1),sizeof(struct outside2)); re
#include<stdio.h>
struct outside1
{
int a;
char b;
char c;
char d[3];
};
struct outside2
{
char a,b,A[2];
char B[2];
};
int main()
{
printf("%zu %zu\n",sizeof(struct outside1),sizeof(struct outside2));
return 0;
}
#包括
外部结构1
{
INTA;
字符b;
字符c;
chard[3];
};
外部结构2
{
字符a,b,a[2];
charb[2];
};
int main()
{
printf(“%zu%zu\n”、sizeof(struct outside1)、sizeof(struct outside2));
返回0;
}
通过使用填充概念预测输出,它将是“12 8”。但实际产出是“12 6”
使用gcc 4.7.2 Debian
有人能解释一下吗
-新手
char
和int
几乎在任何实现中都有自己大小的对齐要求
sizeof(char)
每个标准为1,而int
的常用尺寸为1、2和4
这导致了6、8、12的外部1
的常见尺寸。对于6的外部2 顺便说一句:编译器允许在每个结构成员之后插入任意数量的填充,尽管它通常使用最小的必要条件来考虑对齐限制,以便轻松遵循“公共初始子序列”规则
此外,由于C99或其附近的对齐限制为2的幂,因此对象大小必须能被它平均整除。
char
和int
在几乎任何实现中都有其自身大小的对齐要求
struct outside2
{
char a,b,A[2];
char B[2];
};
sizeof(char)
每个标准为1,而int
的常用尺寸为1、2和4
这导致了6、8、12的外部1
的常见尺寸。对于6的外部2 顺便说一句:编译器允许在每个结构成员之后插入任意数量的填充,尽管它通常使用最小的必要条件来考虑对齐限制,以便轻松遵循“公共初始子序列”规则 此外,由于C99或其附近的对齐限制为2的幂次,因此对象大小必须能被它平均整除
struct outside2
{
char a,b,A[2];
char B[2];
};
您希望此结构的大小为8字节;实际上,它的大小是6字节(在您的实现中)
不需要任何额外的填充。任何类型的数组都具有与元素类型相同的对齐要求,这意味着A
和B
只需要字节对齐
结构中总共有6个char
成员或子成员。由于不需要填充,因此总大小为6字节
例如,编译器可以在末尾添加另外2个字节的填充。例如,如果它要求所有结构或大于某个大小的所有结构至少具有4字节对齐,则可能会这样做。但是您正在使用的编译器并不是这样做的
当然,不同系统的具体对齐和填充要求可能不同;它们由每个编译器强制执行,可能由平台的定义
您希望此结构的大小为8字节;实际上,它的大小是6字节(在您的实现中)
不需要任何额外的填充。任何类型的数组都具有与元素类型相同的对齐要求,这意味着A
和B
只需要字节对齐
结构中总共有6个char
成员或子成员。由于不需要填充,因此总大小为6字节
例如,编译器可以在末尾添加另外2个字节的填充。例如,如果它要求所有结构或大于某个大小的所有结构至少具有4字节对齐,则可能会这样做。但是您正在使用的编译器并不是这样做的
当然,不同系统的具体对齐和填充要求可能不同;它们由每个编译器强制执行,可能由平台的定义。似乎是这样
char
为1字节。尝试将int
置于a
和b
之间的outside 2
。编译器应该添加3个字节(如果int
在您的平台上是4个字节),如果您能够解释(通过更新您的问题)为什么希望sizeof,这将是很有帮助的(struct Outside 2
应该是8而不是6。它似乎是这样的。char
是1个字节。尝试在a
和b
之间放置一个int
,在Outside 2
中。编译器应该添加3个字节(如果int
在您的平台上是4个字节),如果您能解释一下(通过更新您的问题)会有所帮助)为什么你期望sizeof(struct Outside 2)是8而不是6。有没有平台对结构有这样的要求,与它们的实际成员无关?也许是旧的PDP-#?@重复数据消除器:我不知道。在SPARC上,它比x86有更严格的对齐要求,sizeof(struct Outside 2)==6
。是否有任何平台对结构有这样的要求,独立于其实际成员?也许是旧的PDP-#?@重复数据消除器:我不知道。在SPARC上,它比x86有更严格的对齐要求,sizeof(struct outside2)==6
。谢谢@Deduplicator。这太技术化了,你能用更简单的方式回答吗?谢谢@Deduplicator。这太技术化了,你能用更简单的方式回答吗?