我有这样的代码:
// 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个字节返回值。这也浪费了一些时间来移动数据。
我可以避免这种“双重分配”并以某种方式移动数据吗?
更改函数,使其将指向结构的指针作为参数,而不是将其作为值返回。它仍然必须传递一些东西,但是可能只有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);