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

内存对齐

时间:2015-04-24 19:30:25      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:内存对齐 reserved


我们知道,计算一个结构体占用内存的大小一般就是结构体里面每个成员类型的累加。

比如:

typedef struct

{

    char a;

    char b;

    short c;

    int d;

}exam1;

则 sizeof(exam1) == 1+1+2+4 = 8 bytes;


但是,很多时候,编译器都会考虑到内存对齐问题。

假设现在有如下结构体:

typedef struct

{

    char a;

    int b;

}exam2;

则此时 sizeof(exam2) == 8 bytes;而不是==5 bytes;

因为编译器分配内存一般按int来分,对于一个char后接一个int,由于int独占了4个字节,故char 也用了4个字节。

再如:

typedef struct

{

    char a;

    short b;

    int c;

}exam3;

则 sizeof(exam3) == 8 bytes;

编译首先分配4个字节内存空间,发现能容纳下a和b,但随后一个int就没有足够空间容纳了,所以在分配4个字节给int。总共就开辟了8个字节内存空间。


所以我们经常会看到一些结构体里面会定义一个RESERVED保留成员。其实就是为了显示表明存在内存对齐,为了不让内存浪费,显示进行声明,方便以后可以使用该内存。

eg:

typedef struct
{
  __IO uint16_t CR1;
  uint16_t  RESERVED0;
  __IO uint16_t CR2;
  uint16_t  RESERVED1;
  __IO uint16_t OAR1;
  uint16_t  RESERVED2;
  __IO uint16_t OAR2;
  uint16_t  RESERVED3;
  __IO uint16_t DR;
  uint16_t  RESERVED4;
  __IO uint16_t SR1;
  uint16_t  RESERVED5;
  __IO uint16_t SR2;
  uint16_t  RESERVED6;
  __IO uint16_t CCR;
  uint16_t  RESERVED7;
  __IO uint16_t TRISE;
  uint16_t  RESERVED8;
} I2C_TypeDef;

其实定不定义这个RESERVED,都没有关系。就算不定义,该结构体还是占用那么多的内存空间。但是显示定义的好处是:

1.增加一个成员,但是并不会增加内存。

2.显示定义一个成员,方便使用该内存空间。

···

本文出自 “whatever957” 博客,请务必保留此出处http://whatever957.blog.51cto.com/6835003/1638028

内存对齐

标签:内存对齐 reserved

原文地址:http://whatever957.blog.51cto.com/6835003/1638028

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