C++ 变量的内存分配

C++ 变量的内存分配,c++,c,variables,C++,C,Variables,我很困惑。自动、静态和全局变量的分配是在编译时还是在运行时进行的 我知道的是,在编译时,源代码被翻译成机器语言 当编译器发现一个类似inta,它编写指令。编译时是否会发生额外的事情,如内存分配 执行.exe文件时会发生什么情况 计算机(OS)或编译器是否会在运行时或编译时分配足够的内存来保存整数 还可以说全局变量的地址是编译时常量。这是什么意思? 请帮助解决每个问题,尤其是最后一个问题。这里有一大堆问题。在C语言中,有堆栈内存和堆内存。全局变量在堆上。所有非全局的非malloc变量都在堆栈上。将

我很困惑。自动、静态和全局变量的分配是在编译时还是在运行时进行的

我知道的是,在编译时,源代码被翻译成机器语言

当编译器发现一个类似
inta,它编写指令。编译时是否会发生额外的事情,如内存分配

执行.exe文件时会发生什么情况

计算机(OS)或编译器是否会在运行时或编译时分配足够的内存来保存整数

还可以说全局变量的地址是编译时常量。这是什么意思?
请帮助解决每个问题,尤其是最后一个问题。

这里有一大堆问题。在C语言中,有堆栈内存和堆内存。全局变量在堆上。所有非全局的非malloc变量都在堆栈上。将堆栈内存视为在函数内部创建的内存。每个函数调用都会将另一层添加到堆栈中。当函数返回时,将返回在该函数内分配的非malloc内存。全局变量的内存位置永远不会改变,这就是为什么它的位置在编译时是静态的

这里有一大堆问题。在C语言中,有堆栈内存和堆内存。全局变量在堆上。所有非全局的非malloc变量都在堆栈上。将堆栈内存视为在函数内部创建的内存。每个函数调用都会将另一层添加到堆栈中。当函数返回时,将返回在该函数内分配的非malloc内存。全局变量的内存位置永远不会改变,这就是为什么它的位置在编译时是静态的

当编译器找到类似int a;,的语句时;,它写道 指令。是否有额外的事情发生,比如内存分配 编译时间

是的,为堆栈上的变量保留了空间

执行.exe文件时会发生什么情况

太长了,这里无法回答。缩小你的问题范围

计算机(os)或编译器是否会分配足够的内存 在运行时或编译时保存整数

取决于如何分配代码上的内存

也有人说全局变量的地址是编译时 常数。这是什么意思

这意味着在编译时保留内存,因此全局变量的地址在执行期间不会更改

当编译器找到类似int a;,的语句时;,它写道 指令。是否有额外的事情发生,比如内存分配 编译时间

是的,为堆栈上的变量保留了空间

执行.exe文件时会发生什么情况

太长了,这里无法回答。缩小你的问题范围

计算机(os)或编译器是否会分配足够的内存 在运行时或编译时保存整数

取决于如何分配代码上的内存

也有人说全局变量的地址是编译时 常数。这是什么意思


这意味着在编译时保留内存,因此全局变量的地址在执行期间不会更改。

静态全局变量在编译时或运行时分配内存资源。这取决于静态变量是否初始化为零,或者是否具有初始常量值。例如,代码

//global variable with internal linkage
static int array[100];
不会占用可执行文件中的任何空间。。。换句话说,编译器/链接器不会在可执行文件中为该数组分配内存,因为它不包含任何内容。它将留下一个存根,指示何时启动可执行文件,必须为数组分配内存。一旦启动可执行文件,操作系统就会看到链接器留下的存根,并为数组分配和初始化内存(以及堆的其他内存,等等)。另一方面,

//global variable with internal linkage
static int array[100] = { 1, 2, 3};
将占用可执行文件中的空间,因为它在编译时是用常量值初始化的。因此,编译器将在它生成的为数组分配存储的程序集文件的
data
部分中发出代码。然后,链接器将正确布局链接到最终可执行文件的所有程序集文件的数据部分和代码部分。当操作系统将可执行文件加载到内存中时,阵列的内存已经是可执行文件内存“足迹”的一部分

自动变量是在代码执行期间在堆栈上分配的,因此在运行时分配

还可以说全局变量的地址是编译时常量


这有点误导。。。在C语言中,只有链接器创建了可执行文件,操作系统将可执行文件加载到内存中,才能知道任何全局变量的确切内存地址。唯一可以做到这一点的方法是手工组装一个文件并创建一个由操作系统专门加载到给定地址的平面二进制文件,但现代操作系统不允许这样做。相反,全局变量的地址由链接器提供,这样当操作系统在运行时加载可执行文件时,就可以用正确的值替换它们。因此,虽然内存地址在某种意义上是“常量”,即在程序运行时不会随时间而改变,但它的实际值不会在编译时分配。

静态全局变量在编译时或运行时分配内存资源。这取决于静态变量是否初始化为零,或者是否具有初始常量值。例如,代码

//global variable with internal linkage
static int array[100];
不会占用可执行文件中的任何空间。。。换句话说,编译器/链接器不会在可执行文件中为该数组分配内存,因为它不包含任何内容。它会留下一个树桩