首页 > 其他 > 详细

内存对齐

时间:2015-03-17 23:16:19      阅读:318      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!