我可以优化 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);
我有这样的代码:
// 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);