是否为 c/c++ 中的块(有条件或无条件)代码分配了新的堆栈帧?

Is new stack frame allocated for the block(conditional or unconditional) code in c/c++?

我查看了区分堆栈和堆分配的帖子。 我知道堆栈帧是为每个函数调用分配的。

但我的问题在于函数内部的块?这样的代码内存 managed/allocated 怎么样? 这样的堆栈帧的本地存储大小是如何创建的?

class A; class B; class C;

func block() {
    if (condition) {
        A var;
    } else {
        B var;
    }

    {
        A var;
        B var;
        C var;
    }

}

首先,请注意这是一个纯粹的实现细节,编译器可以自由地做它想做的事情,只要结果表现得就像执行了原始代码一样。堆栈帧只是实际硬件用于到达那里的详细信息。

就是说,大多数现实世界的编译器会简单地计算给定函数可能需要的所有堆栈 space 并在函数入口处分配它。它不一定全部被使用(例如,特定的块甚至可能不会在给定的函数调用中输入)但是块所需变量的堆栈 space 仍将作为功能序言。这是完成的,而不是在函数执行的几个点上改变堆栈 space。