keil mdk编译器学习笔记(7)——Keil MDK下变量存储

之前提到过一个编译选项:Optimize for time,这个会影响float变量的存储大小,其实实测是不会影响,依然是4字节

且看测试的截图:stm32F103+keil5.20+ac5

测试代码:

#pragma pack (4) /*指定按4字节对齐方式*/
uint8_t cnt = 3;
float f_var = 5.0f;
uint8_t tick = 6;
uint32_t u32_t = 9;
float *p_float = NULL;
uint8_t *p_uint8 = NULL;

typedef  struct _li_st_1B
{
    uint8_t a;   //1个
    uint16_t b; //2个
    uint32_t c; //4个
    uint64_t d; //8个       
}li_st_1B;

li_st_1B li_st, li_st2;
li_st_1B *p_st = NULL;
#pragma pack () /*取消指定对齐,恢复缺省对齐*/

main函数中结构体赋值:

        p_float = &f_var;
	p_uint8 = &tick;
	p_uint8 = &cnt;

	p_st = &li_st;
	p_st->a = 4;
	p_st->b = 7;
	p_st->c = 10;
	p_st->d = 2;
	
	p_st = &li_st2;
	p_st->a = 0x0a;
	p_st->b = 0xbbbb;
	p_st->c = 0x10101010;
	p_st->d = 0x2020202020202020;

下图是设定位4字节对齐后,代码的存储实际情况,下面划线是全局结构体变量li_st2的数据值和存储情况,起始地址,0x20000040.

对称开启1字节的结构体存储情况:0a好bbbb之前少了一个00,起始地址,0x2000003f,

全局结构体变量li_st存储情况如下:其实地址是0x20000030,

 下面的图更加清晰:

开启4字节对齐

全局结构体变量li_st存储情况:起始地址是0x20000030,

全局结构体变量li_st2的数据值和存储情况,起始地址,0x20000040.

 开启1字节对齐:

全局结构体变量li_st存储情况:起始地址是0x20000030,

全局结构体变量li_st2的数据值和存储情况,起始地址,0x2000003f

 可以看出,针对结构体变量,1字节对齐后,地址已经不是可以4整除的了,那样务必会减慢cpu数据读取的效率。

但是针对普通的变量,字节对齐是无效的。

且看:

 定义为8字节的变量,其实还是会占用了4字节,所以有很多人直接建议,都定义位32位变量,可以提高cpu的读写效率,但是keil编译器已经替我们做了。定义8位和32位都可以的情况下,程序效率不会减慢,自己合理定义即可。

猜你喜欢

转载自www.cnblogs.com/CodeWorkerLiMing/p/12134111.html