结构体占用内存大小计算

图片说明
第一个我理解为 和 double对齐是16
第二个 是 4*3 = 12
第三个理解为 (1+7)+8= 16
第四个 8* 3 =24;

和运行的出来的结果完全不对啊,,看了好几篇 对齐的文章,,把文章示例抄过来运行都是错的。。。。。感觉我这块理解有 严重误区啊

看上去编译器像是4字节对齐,double占两个单位
4+8
4+4+4
4+8
4+8+4

你的想法在gcc 4.9.2 x86_64 上是对的。

我觉得你应该先用sizeof()确定下各种类型的字节长度,然后再用字节对齐方式分析。如果还不能分析清,我们再讨论

你先定义一个结构体指针,并给它附上初值,记录下此时指针指向的地址数值,再让该指针加一,然后记录下此时指针存储的地址,两者相减就可以得到结构体占用的内存大小了

和地址最大到对其,不过也要看是否是4到倍数

另外,你拿别人的示例运行结果不同很正常。 第一,操作系统不同,编译环境不同,都可能导致各类型占内存字节大小不同。 第二,编译环境不同,有可能结构体内存对齐系数不同。你的环境有可能是4字节对齐。 每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的“对齐系数”。

看着就像是大神级别的人物,语言C和系统Linux是不是。觉得会C和Linux的都是大神,可是我一点都不会,该怎么办?

内存对其问题,结构体中的数据对其一般以最大的数据类型所占内存对其,其次就是内存必须是2或4的整数倍。

示例程序是按照4字节对齐,变量a,aa,b,hh的在栈上的布局应该如下(其中,一个字符表示一个字节):
图片说明
另外,楼主可以使用宏**#pragma pack(n) **指定编译时的对齐参数,多尝试几次,比较下就出来结论了。

来一次性说明结构体内存大小问题吧,分三步轻松解决,妈妈以后再也不用担心我分不清结构体长度了。
第一步:选出结构体中占内存最大的成员类型,【double、float、long、int等等等等基本的长度是多少自行补习】。
第二步:以最大成员类型的对齐长度一排为基准,将结构体成员依次排序,只要有一个字节不够就挪到下一排去。
第三步:统计有多少排,乘以最长成员类型的长度,即得到结构体长度。

举例【假设32位系统中】
typedef struct datstruct{
int a;
char b;
int c;
double d;
char e;
char f;
char g;
}_datstruct;

该结构体中最长成员是double d,长度为8字节对齐。以8字节为基准。
画一个每排8字节的格子,按照a~g的顺序依次填进去,a占4字节,b占1字节,c占4字节,因为第一排ab已占据了5字节,所以把c挪到第二排开始【即b后面空出3个无用字节】。在后面d占据8字节,只好挪到第三排开始排,最后efg在第四排。排序的原则就是严格按照结构体成员本身的顺序,空间不够就挪到下一排。
上面一共排了4排,每排按照8字节对齐,于是总长度32字节。