首页 > 其他 > 详细

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

时间:2020-01-02 19:09:30      阅读:123      评论:0      收藏:0      [点我收藏+]

之前提到过一个编译选项: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位都可以的情况下,程序效率不会减慢,自己合理定义即可。

 

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

原文:https://www.cnblogs.com/CodeWorkerLiMing/p/12134111.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!