我遇到了这个 [问题]:如何将值存储到多参数结构中并将 typedef 结构传递给函数?. 我建议在 if 之前声明一个 dtErrorMessage 变量,并将其用于两个条件,而不是声明两个不同的变量,如下所示:
// Initial version
if(GetTemperature() <= -20)
{
dtErrorMessage low;
low.errorCode=ERROR_CODE_UNDER_TEMP;
low.temperature=GetTemperature();
SendErrorReport(&low);
}
if(GetTemperature() >= 160)
{
dtErrorMessage high;
high.errorCode=ERROR_CODE_OVER_TEMP;
high.temperature=GetTemperature();
SendErrorReport(&high);
}
// My version
dtErrorMessage err;
int8_t temp = GetTemperature(); // Do not consider change during evaluation
if(temp <= -20)
{
err.errorCode = ERROR_CODE_UNDER_TEMP;
err.temperature = temp;
SendErrorReport(&err);
}
else if(temp >= 160)
{
err.errorCode = ERROR_CODE_OVER_TEMP;
err.temperature = temp ;
SendErrorReport(&err);
}
else
{
// Do not send error report
}
我的问题是:(在嵌入式方面,)我是对的,这样无论条件如何,都会在 RAM 中创建两个局部变量?因此,它会在 if 之前使用一个无条件变量声明来减少所需的 RAM,然后将其用于两个条件,对吗?
我找不到正确的术语来搜索自己回答这个问题。
具有自动存储持续时间的变量的生命周期是直到块结束。存储将得到保证,并且它将保留常量地址(即由 eg 给出的地址&
)直到块结束,之后所有指向该对象的指针将变得不确定。
C标准并没有说low
和high
必须占用相同的内存部分!存储必须保证到包含声明的块的末尾,但它也可以更长。另一方面,as-if 规则表示程序只需要像根据 C 标准的规则为抽象机编译的程序一样运行,因此高质量的实现可能会
low
并high
同时在不同的地址,和err
如果else
分支被采用,则不保留内存。实际上使这两个的执行行为几乎相同。
不同之处主要在于文体:在您的版本中键入的内容较少,而原始版本适用于糟糕的编译器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句