内存对齐

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]存放在内存的位置如下

........

....。。。。

 程序猿必读

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