#include<stdio.h>
int main()
{
struct test
{
char c;
int y;
float r;
double d;
} t1;
printf("%d\n",sizeof(t1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:24我的gcc 4.3.2 Ubuntu 12.04
我的解释: 我认为24是对的.如果我错了,请纠正我?
从而 Size = 1(char) + 3(Padded in Char case) + 4(int) + 4(float) + 4(padded for Double) + 8(double) = 24
清晰度:
由于Chunks采用4字节采集.所以每个地址都是4的倍数.对于double,Next地址必须是1012.但它不是8的倍数.所以填充它!并从1016年开始
我的问题 - 24是正确的,我的解释是正确的还是我的解释是错的,请解释一下?
在特定编译器输出具有该结构的特定布局的二进制文件的意义上,您的解释是正确的.如果您已正确预测输出,那么您的预测显然对于您在此特定时间的特定设置是正确的.
但是,无论如何,结构的大小都不是用C严格定义的.在这个主题中唯一定义的是结构成员的顺序和第一个成员的偏移量.填充,因此,结构的总大小是未定义的,它留作编译器的决定.显然,编译器填充结构的主要原因是通过基于各个类型的成员的正确对齐来提高性能(正如您正确指出的那样).但是(这在这里很重要)编译器根据目标架构选择最有效的填充.例如,如果体系结构具有128位int,则可以想象结构的大小将如何根本不同.
因此,如果涉及C语言的定义方面(或除了您描述的任何设置之外),您的预测将毫无根据.它自然会匹配一些设置,但只是偶然.