【发布时间】:2017-09-02 08:52:21
【问题描述】:
我了解全局数据将存储在 .BSS 或 .data 段中。
如果我在函数内部定义了诸如结构之类的数据,则该结构只会在调用该函数时被放置在堆栈中。
在调用函数之前,编译器在启动时将这些数据存储在哪里? 我知道编译器会根据目标和调用约定等生成不同的汇编代码,但一般来说,这个本地结构是否必须首先存储在某个地方,以便编译器知道如何在调用函数时将其放入堆栈?提前致谢。
【问题讨论】:
-
如果您的意思是局部变量已初始化,那么初始化确实必须存储在某个地方(很可能是数据段),除非它非常简单(可能所有字节都为零)。但这就是为什么 C 在调用函数时不将局部(自动)变量设置为预定值的部分原因;处理初始化通常需要时间/空间,无论如何都会被覆盖。
-
但是它如何知道每次调用时都将结构放在那里、大小、成员的偏移量等?这些信息不是存储在某个地方吗?
-
是的,它存储在某个地方——我建议它可能是数据部分,但我没有剖析您机器上生成的汇编语言以了解它是如何完成的;事实上,我也没有检查过我的机器)。编译器/链接器的工作是确保它正确发生。该标准没有规定必须如何完成;它只是要求必须达到效果。
标签: c function struct compilation stack