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

时间:2014-10-03 15:55:19

标签: memory memory-management stack

无论好的或坏的形式,如果语句导致堆栈中的更多内存与没有大括号的单行if语句相比,那么在单行中执行大括号?

例如。会这样吗

if (foo) bar = baz;

使用比此更少的内存

if (foo) { bar = baz; }

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

2 个答案:

答案 0 :(得分:1)

你在想什么语言?

总的来说,在这种情况下,我能想到的额外内存使用的唯一可能性是盲目使用缓冲区溢出检测技术(参见http://en.wikipedia.org/wiki/Buffer_overflow_protection的示例),并且它可能更有可能在调试版本,因为在这些情况下通常会禁用优化。

发布版本中的正确编译器会在不需要时消除此类代码。

答案 1 :(得分:1)

Tl; dr取决于。

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

在C中,在if (foo) bar = baz;的情况下,暗示了新的范围。

但是if是否可以使用大括号来编写而不会在程序中的某个位置导致不同的堆栈大小?为了最好地回答这个问题,考虑一个假设的语言解析器,它接受以下语法子集,用Backus-Naur形式表示。

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 (foo) { bar = baz; }可以解决此问题。

IF_AST
    EXPRESSION_AST
        ...
    BLOCK_STATEMENT_AST
        STATEMENT_LIST_AST
            STATEMENT_AST
                ...

从我们假设的解析器的角度来看,语法的差异可能导致不同的大小堆栈。根据对生成的AST的处理方式,它还可以导致程序的内部表示形式不同,甚至可以导致不同大小的内存占用。

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