我可以优化 returns 12 字节结构函​​数的内存使用吗?

Can I optimize memory usage of function that returns 12-byte struct?

我有这样的代码:

// 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 个字节作为 return 值。 移动数据也浪费了一些时间。

我可以避免这种情况 "double allocation" 并以某种方式移动数据吗?

更改函数,使其将指向结构的指针作为参数,而不是将其作为值返回。它仍然必须传递一些东西,但它可能只有 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);