Memory if/else语句中的大括号是否会影响堆栈上的内存?

Memory if/else语句中的大括号是否会影响堆栈上的内存?,memory,memory-management,stack,Memory,Memory Management,Stack,无论形式是好是坏,与没有大括号的单行if语句相比,单行if语句中的大括号是否会在堆栈上分配更多内存 比如说。会这样吗 if (foo) bar = baz; 使用比这个更少的内存 if (foo) { bar = baz; } 据我所知,大括号为局部变量定义了一个新的范围。这些是在堆栈上分配的。单行if语句不需要大括号,但它们对内存的影响是否仍然相同?您在考虑哪种语言 总的来说,在这种情况下,我能想到的额外内存使用的唯一可能性是盲目使用缓冲区溢出检测技术的草率编译器(请参见示例),在调试构建

无论形式是好是坏,与没有大括号的单行if语句相比,单行if语句中的大括号是否会在堆栈上分配更多内存

比如说。会这样吗

if (foo) bar = baz;
使用比这个更少的内存

if (foo) { bar = baz; }

据我所知,大括号为局部变量定义了一个新的范围。这些是在堆栈上分配的。单行if语句不需要大括号,但它们对内存的影响是否仍然相同?

您在考虑哪种语言

总的来说,在这种情况下,我能想到的额外内存使用的唯一可能性是盲目使用缓冲区溢出检测技术的草率编译器(请参见示例),在调试构建中更可能出现这种情况,因为在这些情况下通常禁用优化

发布版本中的适当编译器将在不需要时消除此类代码。

Tl;这要看情况而定

这将取决于解释器/编译器/其他的实现方式

在C中,在
的情况下,如果(foo)bar=baz,暗示了一个新的作用域

但是如果使用大括号编写的
与不使用大括号编写的
会在程序中的某个点产生不同的堆栈大小吗?为了最好地回答这个问题,考虑一个假设的语言分析器,它接受下面的语法子集,用巴科斯NURR形式表示。
IF_AST ::= IF_TOKEN EXPRESSION_AST STATEMENT_AST | IF_TOKEN EXPRESSION_AST BLOCK_STATEMENT_AST
STATEMENT_LIST_AST ::= OPEN_BLOCK_TOKEN | STATEMENT_LIST_AST STATEMENT_AST
BLOCK_STATEMENT_AST ::= STATEMENT_LIST_AST CLOSE_BLOCK_TOKEN
在这种情况下,
if(foo)bar=baz
可以解析为一个抽象语法树(AST),它看起来像这样

IF_AST
    EXPRESSION_AST
        ...
    STATEMENT_AST
        ...
IF_AST
    EXPRESSION_AST
        ...
    BLOCK_STATEMENT_AST
        STATEMENT_LIST_AST
            STATEMENT_AST
                ...
其中,
if(foo){bar=baz;}
可以解析为这样的内容

IF_AST
    EXPRESSION_AST
        ...
    STATEMENT_AST
        ...
IF_AST
    EXPRESSION_AST
        ...
    BLOCK_STATEMENT_AST
        STATEMENT_LIST_AST
            STATEMENT_AST
                ...
从我们假设的解析器的角度来看,语法上的差异可能导致不同大小的堆栈。根据对生成的AST所做的操作,它还可能导致程序的不同内部表示,甚至导致不同大小的内存占用


今天的编译器通常都经过了大量优化,因此很可能生成的程序是相同的。但是,您的示例可能会在构建程序期间以及生成的程序本身中产生不同的堆栈大小。

为什么您认为这可能会产生任何差异?源代码是等效的,因此编译器将为任何一种情况生成相同的代码。如果有疑问,请编译这两种情况并查看生成的代码。大括号(和
对)只与编译器有关。它们都与运行时代码中的堆栈空间或内存无关。Paul R,你能给我一个快速的运行过程,让我看看如何从上面两个示例中查看编译后的代码吗?