问题描述
- 结构体占用内存大小计算
-
第一个我理解为 和 double对齐是16
第二个 是 4*3 = 12
第三个理解为 (1+7)+8= 16
第四个 8* 3 =24;和运行的出来的结果完全不对啊,,看了好几篇 对齐的文章,,把文章示例抄过来运行都是错的。。。。。感觉我这块理解有 严重误区啊
解决方案
看上去编译器像是4字节对齐,double占两个单位
4+8
4+4+4
4+8
4+8+4
解决方案二:
结构体占内存大小计算
struct结构体占内存大小计算
struct结构体占内存大小计算
解决方案三:
你的想法在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) **指定编译时的对齐参数,多尝试几次,比较下就出来结论了。