我正在开发一个嵌入式应用程序,其中RAM可用性非常有限。在分析内存消耗时,我发现bss段相当大,并且进一步研究发现这可能是由于变量初始化不足造成的。
以下是我通常会做的事情的示例。例如,假设我有这个结构体:
typedef struct
{
float time;
float value;
} pair_t;
我通常不会在声明变量时初始化,而是像这样做:
pair_t test()
{
pair_t ret;
ret.time = 0;
ret.value = 0;
return ret;
}
我应该像这样一次性完成所有工作吗?还是没有区别?
pair_t test()
{
pair_t ret = (pair_t)
{
.time = 0,
.value = 0
};
return ret;
}
bzero(ptr, size)
可能会更有优势。 - mvppair_t test(void) { return (pair_t){ 0.0, 0.0 }; }
(或者0.0f
,但我想如果与0.0
相比较的话不会有任何区别)。测量或查看生成的汇编代码是查看符号表示法是否有差异的最佳方法。 - Jonathan Leffler#define PAIR_T_INITIALIZER {0.0,0.0}
”),这样初始化程序和结构体就在同一个文件中并排放置(更易于维护,在向结构添加新字段时更难出错)。在需要时,使用(例如)“pair_t ret = PAIR_T_INITIALIZER;
”。但这与内存消耗无关。 - Brendanpair_t
”将花费您“sizeof(pair_t)
”个字符,无论您做什么或如何初始化它;除非一切都永远初始化为零。 - Brendanstatic
吗?否则它不会对 bss 段的大小产生贡献。当然,除非编译器在 bss 段中创建一个复合字面量,然后插入一个 memcpy。 - Ajay Brahmakshatriya