不同 C 模块中同名的自动变量:内存分配

auto variables with the same name in different C blocks: memory allocation

提问人:apadana 提问时间:9/21/2019 最后编辑:Vlad from Moscowapadana 更新时间:9/21/2019 访问量:113

问:

假设我在 C 程序中有一个这样的结构:

if (res == NULL)
{
    int i = 1;
    ...
}
else
{
    int i = 2;
    ...
}

如果我改写

int i;

if (res == NULL)
{
    i = 1;
    ...
}
else
{
    i = 2;
    ...
}

?

在 if-else 结构之外不需要该变量。i

c 变量 scope automatic-storage

评论

2赞 Yunnosch 9/21/2019
这取决于优化级别,不能跨编译器实现进行预测。猜一猜:不。(这假设在不完整的代码中,矛头仍然在函数级别,而不是全局。如果它是全局的,我猜你是浪费而不是节省内存。int i;
0赞 apadana 9/21/2019
@Yunnosch,如果名字不同怎么办?
0赞 Yunnosch 9/21/2019
顺便说一句,请定义“内存”的含义。叠?总代码大小?静态RAM内存?...
0赞 Yunnosch 9/21/2019
这将与相同名称一样取决于。让我向你介绍弗拉兹的答案。它提供了正确的思考方式。Erics 的答案更接近你想知道的,但我推荐 Vlads 的思维方式。

答:

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:在相当简单的代码中,它们根本不会在堆栈上;编译器将仅使用寄存器完成所有工作。(而且,在许多处理器中,值保存在与值不同的寄存器中,因此有必要对它们使用不同的寄存器。如果确实需要使用堆栈,因为一段代码中有太多事情要做,无法将所有内容都保存在寄存器中,编译器应该智能地将数据“溢出”到堆栈中。给定变量在堆栈上可能没有单个保留位置;编译器将在需要时使用它需要的内容。doublechar
1赞 Eric Postpischil 9/21/2019
@apadana:因此,堆栈上的特定位置可能在程序的某个点用于变量,而在另一个点用于变量。并且可能在程序中某个点的某个位置临时位于堆栈上,但在程序中的另一个点位于另一个位置。除非您获取变量的地址并将其传递给另一个例程,否则通常是正确的。然后编译器必须为该变量保留一个位置,因为它必须有一个固定的地址。否则,编译器可以自由地移动内容。iji
1赞 Eric Postpischil 9/21/2019
@apadana:这是了解 C 源代码没有指定编译器必须严格执行的一系列操作的好时机。它指定了一个抽象计算,编译器分析源代码,生成该计算的表示形式,然后尝试找出一种实现获得所需结果的指令的好方法,即使最终结果看起来与原始源代码大不相同。