码迷,mamicode.com
首页 > 其他好文 > 详细

内存对齐

时间:2015-03-17 23:18:50      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

1、内存对齐原因

  • 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
  • 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
2、内存对齐后大小的计算(sizeof(int)=4,sizeof(char)=1,sizeof(float)=4,sizeof(double)=8)
  • 针对结构体

    

#include <stdio.h>
struct MyStruct
{
   char da;
   double dda;
   int type[3];
};

int main(void)
{
   int leng=sizeof(struct MyStruct);
   printf("%d",leng);
   return 0;
}

  结果为32;

解析:在结构体MyStruct中,基本类型长度最长的是double,为8个字节。所以以8个字节为标准进行对齐,则该结构体的变量所存储的位置应该为

.。。。。。。。(char)

........(double)

........(type[0]type[1])

....。。。。(type[2])

其中。是表示为了对齐所补上的字节。

 

如果结构体中的double类型改为int类型,即结构体中的数据类型最长的长度为4,则以4个字节为标准进行对齐,结果会变为20.

 

  • 针对联合体
#include <stdio.h>
union MyStruct
{
   char da;
   double dda;
   int type[3];
};

int main(void)
{
   int leng=sizeof(union MyStruct);
   printf("%d",leng);
   return 0;
}

结果为16.

解析:在union中,变量共享内存,因为double类型长度最长,所以以8字节为标准,而union的大小就是最大的变量的长度。

int type[3]存放在内存的位置如下

........

....。。。。

 

内存对齐

标签:

原文地址:http://www.cnblogs.com/longzhongren/p/4345740.html

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