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

  • 相关阅读:
    day28-描述符应用与类的装饰器
    MySQL-快速入门(8)存储过程、存储函数
    MySQL-快速入门(7)索引
    MySQL-快速入门(6)连接查询、子查询、正则表达式查询、数据的插入删除更新
    MySQL-快速入门(5)数据查询-常用关键字、分组查询、聚合函数
    MySQL-快速入门(4)MySQL函数
    MySQL-快速入门(3)运算符
    MySQL-快速入门(2)数据类型
    MySQL-快速入门(1)基本数据库、表操作语句
    MySql-Mysql技术内幕~SQL编程学习笔记(N)
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12134111.html
Copyright © 2011-2022 走看看