(有条件的?)在函数中创建局部变量
(Conditional?) creation of local variables in function
我遇到了这个[问题]:How can I store values into a multi-parameter struct and pass typedef struct to a function?。
我建议在 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中创建两个局部变量?因此,它会减少所需的 RAM,在 if 之前使用一个无条件变量声明,然后在两个条件下都使用它,对吗?
我找不到正确的术语来搜索自己得到这个答案。
具有自动存储持续时间的变量的生命周期是直到块结束。存储将得到保证,它将保留常量地址(即由 &
给出的地址)直到块结束,之后所有指向该对象的指针都将变得不确定。
C 标准 不是 说 low
和 high
必须占用相同的内存部分!必须保证存储到包含声明的块的末尾,但它也可以更长。另一方面,as-if 规则表示程序只需要表现得好像它是根据 C 标准规则为抽象机编译的程序,因此高质量的实现可能
- 不在不同地址同时为
low
和high
保留内存,和
- 不为
err
保留内存以防 else
分支被采用。
实际上使这两个的执行行为几乎相同。
主要是风格上的差异:在您的版本中需要键入的内容更少,而原始版本可以适应糟糕的编译器。
我遇到了这个[问题]:How can I store values into a multi-parameter struct and pass typedef struct to a function?。 我建议在 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中创建两个局部变量?因此,它会减少所需的 RAM,在 if 之前使用一个无条件变量声明,然后在两个条件下都使用它,对吗?
我找不到正确的术语来搜索自己得到这个答案。
具有自动存储持续时间的变量的生命周期是直到块结束。存储将得到保证,它将保留常量地址(即由 &
给出的地址)直到块结束,之后所有指向该对象的指针都将变得不确定。
C 标准 不是 说 low
和 high
必须占用相同的内存部分!必须保证存储到包含声明的块的末尾,但它也可以更长。另一方面,as-if 规则表示程序只需要表现得好像它是根据 C 标准规则为抽象机编译的程序,因此高质量的实现可能
- 不在不同地址同时为
low
和high
保留内存,和 - 不为
err
保留内存以防else
分支被采用。
实际上使这两个的执行行为几乎相同。
主要是风格上的差异:在您的版本中需要键入的内容更少,而原始版本可以适应糟糕的编译器。