C++中作用域左括号处的存储分配

tuwxkamq  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(83)

在阅读布鲁斯·埃克尔的《C的思考》时,我看到了下面的文字
在c
中,变量可以在作用域中的任何位置定义,所以看起来变量的存储空间可能直到定义时才被定义。实际上更有可能的是,编译器会在c中将所有存储空间分配给作用域的开括号。
怀疑:我猜它只用于在堆栈上分配存储,但我的怀疑是编译器如何知道在到达其定义之前在main(或其他fn)中定义了多少个对象(甚至没有一个),以便在范围的开括号中分配存储。

i2byvkas

i2byvkas1#

编译器可以在实际发出任何代码之前分析整个函数。通常情况下,编译器将计算出每个花括号段需要多少存储空间,并在函数序言中添加一条汇编指令,以调整堆栈指针的字节数。
然而,实际上初始化变量发生在代码中的适当位置。

qmelpv7a

qmelpv7a2#

编译器不一定以逐行的方式解析代码。在编译期间,它将遍历整个范围/函数,并确定要在堆栈上分配的内存量。
这也是编译存在的原因之一:)

相关问题