在函数中或特别是在中断处理程序中使用C块作用域是否有任何优点或缺点?
从链接 - http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0472i/CJAIIDCG.html - 参考堆栈使用情况。
通常,您可以通过以下方式降低程序的堆栈要求:
使用C块的优点或缺点范围不是很明确。
答案 0 :(得分:2)
如果你写:
{
int foo[1000];
int bar[1000];
… code that uses foo …
… code that uses bar …
}
然后整个块存在foo
和bar
,并且必须使用不同的内存。 (编译器/优化器可能会认识到它们没有被同时使用并安排使用相同的内存,但是各种各样的东西都会干扰它,所以你不能依赖它。)
如果你写:
{
{
int foo[1000];
… code that uses foo …
}
{
int bar[1000];
… code that uses bar …
}
}
然后foo
和bar
仅在不同时间存在,因此编译器可以为它们使用相同的内存。
答案 1 :(得分:0)
这意味着如果使用更多范围限制变量的生命周期,编译器可以优化函数执行所需的空间。考虑像
这样的东西 $('#frmEditNewCompany').ajaxForm({
beforeSubmit: function (arr, $form, options) {
$(".blockerModal").show();
},
onsubmit: function (event) {
$(".blockerModal").show();
},
success: function (data, textStatus, jqXHR) {
alert("after submit")
if (data.Success == true) {
$("#dv-modal-lg").modal("hide");
}
eval(data.Script);
$(".blockerModal").hide();
},
error: function (jqXHR, textStatus, errorThrown) {
$(".blockerModal").hide();
}
});
编译器必须保持int x;
// [some code]
int y;
// [some code not using x]
直到函数结束。如果你改为像这样构造它:
x
{
int x;
// [some code]
}
{
int y;
// [some code not using x]
}
使用x
在代码中不存在,因此编译器可能重用y
之前占用的相同空间(并且很可能编译器确实会这样做。)
一般说明:如果你必须在ISR中考虑这个问题,那么你的ISR可能已经太大了。保持ISR尽可能最小和最快 - 例如将事件排队可能是ISR的良好行动。
答案 2 :(得分:0)
使用C代码中的块来使代码清晰且合乎逻辑。这适用于所有 C编程 - 而不仅仅是中断。通常,只在使用它们的范围内定义局部变量通常是个好主意。 (不要过分关注并为变量定义新的范围 - 但如果变量仅在循环或条件的分支中使用,则在该块中定义它。)
只要您使用优化编译器(并且启用了优化!),当您在块内或外部使用局部变量时,堆栈空间和使用情况很少有差异。编译器足够聪明,可以查看变量的有效生命周期,并适当地限制其分配。
如果你不使用编译器进行优化 - 你应该是!