我们知道,计算一个结构体占用内存的大小一般就是结构体里面每个成员类型的累加。
比如:
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
原文地址:http://whatever957.blog.51cto.com/6835003/1638028