在阅读布鲁斯·埃克尔的《C的思考》时,我看到了下面的文字在c中,变量可以在作用域中的任何位置定义,所以看起来变量的存储空间可能直到定义时才被定义。实际上更有可能的是,编译器会在c中将所有存储空间分配给作用域的开括号。怀疑:我猜它只用于在堆栈上分配存储,但我的怀疑是编译器如何知道在到达其定义之前在main(或其他fn)中定义了多少个对象(甚至没有一个),以便在范围的开括号中分配存储。
i2byvkas1#
编译器可以在实际发出任何代码之前分析整个函数。通常情况下,编译器将计算出每个花括号段需要多少存储空间,并在函数序言中添加一条汇编指令,以调整堆栈指针的字节数。然而,实际上初始化变量发生在代码中的适当位置。
qmelpv7a2#
编译器不一定以逐行的方式解析代码。在编译期间,它将遍历整个范围/函数,并确定要在堆栈上分配的内存量。这也是编译存在的原因之一:)
2条答案
按热度按时间i2byvkas1#
编译器可以在实际发出任何代码之前分析整个函数。通常情况下,编译器将计算出每个花括号段需要多少存储空间,并在函数序言中添加一条汇编指令,以调整堆栈指针的字节数。
然而,实际上初始化变量发生在代码中的适当位置。
qmelpv7a2#
编译器不一定以逐行的方式解析代码。在编译期间,它将遍历整个范围/函数,并确定要在堆栈上分配的内存量。
这也是编译存在的原因之一:)