提问人:apadana 提问时间:9/21/2019 最后编辑:Vlad from Moscowapadana 更新时间:9/21/2019 访问量:113
不同 C 模块中同名的自动变量:内存分配
auto variables with the same name in different C blocks: memory allocation
问:
假设我在 C 程序中有一个这样的结构:
if (res == NULL)
{
int i = 1;
...
}
else
{
int i = 2;
...
}
如果我改写
int i;
if (res == NULL)
{
i = 1;
...
}
else
{
i = 2;
...
}
?
在 if-else 结构之外不需要该变量。i
答:
2赞
Vlad from Moscow
9/21/2019
#1
不要为内存而烦恼。
代码片段具有不同的语义。
在第一个代码片段中,(两个不同的)变量仅在 if 和 else 语句中可见。
因此,不能在 if 语句之外访问它们。i
在第二个代码片段中,变量 i 在 if 语句之外可见且处于活动状态。如果它只应该在 if 语句中使用,那么在不使用它的块中声明变量是一种糟糕的编程风格。
3赞
Eric Postpischil
9/21/2019
#2
对于任何一种情况,即使是中等质量的编译器都不会比另一种情况生成更好的代码,除非其优化功能可能被禁用。
评论
0赞
apadana
9/21/2019
即使名字不同?
1赞
Eric Postpischil
9/21/2019
@apadana:即使名字不同。对值的创建和使用位置的数据流分析是优化的标准部分,无论名称如何,示例代码中值的生存期都是相同的。
1赞
Eric Postpischil
9/21/2019
@apadana:在相当简单的代码中,它们根本不会在堆栈上;编译器将仅使用寄存器完成所有工作。(而且,在许多处理器中,值保存在与值不同的寄存器中,因此有必要对它们使用不同的寄存器。如果确实需要使用堆栈,因为一段代码中有太多事情要做,无法将所有内容都保存在寄存器中,编译器应该智能地将数据“溢出”到堆栈中。给定变量在堆栈上可能没有单个保留位置;编译器将在需要时使用它需要的内容。double
char
1赞
Eric Postpischil
9/21/2019
@apadana:因此,堆栈上的特定位置可能在程序的某个点用于变量,而在另一个点用于变量。并且可能在程序中某个点的某个位置临时位于堆栈上,但在程序中的另一个点位于另一个位置。除非您获取变量的地址并将其传递给另一个例程,否则通常是正确的。然后编译器必须为该变量保留一个位置,因为它必须有一个固定的地址。否则,编译器可以自由地移动内容。i
j
i
1赞
Eric Postpischil
9/21/2019
@apadana:这是了解 C 源代码没有指定编译器必须严格执行的一系列操作的好时机。它指定了一个抽象计算,编译器分析源代码,生成该计算的表示形式,然后尝试找出一种实现获得所需结果的指令的好方法,即使最终结果看起来与原始源代码大不相同。
评论
int i;