看到一篇关于结构体的不错的文章,虽然里面有一些错误,但是值得一看,看完后,自己也设计了一个题目: struct st1{ char a[11]; int b;}; struct st2{ char a; st1 s1; short b;}; struct st3{ char a1; short a2; char a3;}; struct st4{ st3 s1; int b1; double b2; char b3;}; sizeof(st1), sizeof(st2), sizeof(st3), sizeof(st4)依次为多少?特别是sizeof(st2)的陷阱很大。 用VC2005运行一下就有了答案,在watch下追踪一下各个成员的地址(如st2 val; &(val.a), &(val.s1.a), &(val.s1.b), &(val.b) ),观察各个成员间的地址偏移量,就会更加清晰。 原文:http://blog.csdn.net/motadou/archive/2008/12/15/3521399.aspx 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作。否则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节内存块上。 结构体对齐包括两个方面的内容 结构体大小的计算方法和步骤 结构体大小计算举例 此例子Windows和Linux计算方法一样,如下: 例子2: 例子1和例子2不同之处在于例子2中使用了#pragma pack(2)编译参数,它强制指定对齐模数是2。 例子3: 前两例中,数据成员在Linux和Windows下都相同,例3中double的对齐模数在Linux中是4,在Windows下是8,针对这种模数不相同的情况加以分析。 在Linux中计算步骤如下: 例子4: 此例子Windows和Linux计算方法一样,如下: 例子5: 例子5和前几个例子均不同,在此例子中我们要计算struct my_struct的大小,而my_struct中嵌套了一个my_test结构体。这种结构体应该如何计算呢?原则是将my_test在my_struct中先展开,然后再计算,即是展开成如下结构体: struct my_struct { int my_test_a; 此例子Windows中的计算方法如下: |
一篇很不错的C结构体对齐的文章
最新推荐文章于 2024-05-25 15:44:32 发布
所有的例子我都亲自试过,看过许多类似的介绍结构体字对齐的,这篇算是最好的了,推荐给大家