我可以优化返回12字节结构的函数的内存使用情况吗?

问题描述 投票:0回答:1

我有这样的代码:

// my struct size is 12 bytes
typedef struct timer_entry_t {
    uint16_t t1_time_setting;
    uint16_t t2_time_setting;
    uint8_t time_range;
    uint8_t timer_mode;
    uint8_t relay_output_mask;
    uint8_t failure_relay_output_mask;
    uint8_t activating_scheduler_rule_id;
    uint8_t deactivation_inputs_mask;
    uint8_t activation_inputs_mask;
    uint8_t p12;
} timer_entry_t;

timer_entry_t GetTimerEntry(uint8_t e_idx) // uint8_t e_idx: 1 byte Local
{
    uint16_t mb_reg_idx; // 2 bytes Local
    uint16_t mb_reg;     // 2 bytes Local

    timer_entry_t entry; // 12 bytes Local

    // (...) fill timer_entry_t struct content

    return entry;        // 12 bytes Params
}

我的编译器(用于8位Microchip微控制器的XC8)生成具有以下信息的.lst文件:

 49215 ;; Data sizes:     COMRAM   BANK0   BANK1   BANK2   BANK3   BANK4   BANK5   BANK6   BANK7   BANK8   BANK9  BANK10  BANK1
      +1  BANK12  BANK13
 49216 ;;      Params:         0      12       0       0       0       0       0       0       0       0       0       0       
      +0       0       0
 49217 ;;      Locals:         0      17       0       0       0       0       0       0       0       0       0       0       
      +0       0       0
 49218 ;;      Temps:          0       2       0       0       0       0       0       0       0       0       0       0       
      +0       0       0
 49219 ;;      Totals:         0      31       0       0       0       0       0       0       0       0       0       0       
      +0       0       0
 49220 ;;Total ram usage:       31 bytes

因此,此函数使用12个字节作为本地timer_entry_t entry;变量,并使用12个字节返回值。这也浪费了一些时间来移动数据。

我可以避免这种“双重分配”并以某种方式移动数据吗?

c c99 xc8
1个回答
1
投票

更改函数,使其将指向结构的指针作为参数,而不是将其作为值返回。它仍然必须传递一些东西,但是可能只有4个字节而不是12个字节。

void GetTimerEntry(uint8_t e_idx, timer_entry_t *entry) // uint8_t e_idx: 1 byte Local
{
    uint16_t mb_reg_idx; // 2 bytes Local
    uint16_t mb_reg;     // 2 bytes Local


    // (...) fill timer_entry_t struct content

    return;
}

然后代替

timer_entry_t entry = GetTimerEntry(idx);

您使用

timer_entry_t entry;
GetTimerEntry(idx, &entry);
© www.soinside.com 2019 - 2024. All rights reserved.