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位都可以的情况下,程序效率不会减慢,自己合理定义即可。