码迷,mamicode.com
首页 > 编程语言 > 详细

【C语言】结构体中的内存对齐问题

时间:2015-05-17 09:22:44      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:c语言   结构体 内存对齐   

话说大家有没有发现结构体中的内存对齐问题很有意思呢?我们这一次就一起研究一下这个问题为什么值得人探讨。

结构体内存对齐有三个原则;

1.数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)

3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

struct  A

{

     int a;        4     8       4                    4

     char c;     1     8       1                    1    

     char  d;     1    6       1                    1

};

根据第三条,结构体的大小为8;

 

struct B

{

    char c;     1    8     1                       1个其余三个补齐   4

     int  a;      4     8     4                       4

     char d;    1      8    1                    1个其余三个补齐   4

 

};

结构体大小为12;

 

struct c

{

     int a;                  4      8       4                  4

   char  c;              1     8        1                  1个其余三个补齐    4

   double   d;         8     8        8                  8

};

结构体大小为16;

 

struct   d

{

int a;                    4      8       4             4个其余四个补齐      8

double  b;            8      8       8              8

char    c;             1      8        1              1个其余7个补齐      8

}  ;

结构体大小为24;

 

 

最后我们应该知道几点:

为什么要设计内存对齐的处理方式呢?

如果体系结构是不对齐的,成员将会一个挨一个存储,显然对齐更浪费了空间。

 

那么为什么要使用对齐呢?

体系结构的对齐和不对齐,是在时间和空间上的一个权衡。对齐节省了时间。

 

在设计结构体的时候,一般会尊照一个习惯,就是把占用空间小的类型排在前面,占用空间大的类型排在后面,这样可以相对节约一些对齐空间。

 

 

【C语言】结构体中的内存对齐问题

标签:c语言   结构体 内存对齐   

原文地址:http://blog.csdn.net/liuxiaoqian_/article/details/45776251

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!