自动内存分配发生在编译时或 C 中的 运行 时?
Automatic memory allocation occurs at compile time or at run time in C?
如果我们谈论静态内存分配,据说它是在编译时分配的,但实际上编译器只是处理这个内存分配,它实际上只在程序开始时分配。例如,编译器可能会在编译后的二进制文件中创建一个大的 data
段,当程序加载到内存中时,程序 data
段内的地址将用作分配内存的位置.
如果我谈论自动内存分配,它是在控件进入新范围时分配的。现在我的疑问是,在这种情况下,编译器是否也会出现并将一些虚拟地址传递到编译后的二进制文件中,这些地址后来成为 运行 期间实际分配内存的地址,或者该内存仅在 运行 分配没有任何编译器作用的时间就像分配动态内存的方式一样?
如果我有一些像这样的局部变量怎么办:
int a = 10;
它会有编译时分配还是运行时间分配?
自动分配发生在 run-time,尽管它的性质非常 system-specific。自动存储持续时间变量可能最终进入寄存器、堆栈或完全优化。
如果它们最终进入堆栈,编译器会为分配变量的函数创建局部作用域偏移量。也就是说,该变量可能被称为 SP + 8
或类似的东西,其中 SP 是堆栈指针。当函数被输入时,它又可以保存任何值——编译器或机器代码不知道或不关心它,这就是堆栈溢出存在的原因。
您可能会发现这很有用:What gets allocated on the stack and the heap?。
局部变量在内存中存储时是放在栈上的。
通常,函数的总堆栈大小要求是在编译时计算的。
然后,当进入一个函数时,堆栈指针会根据函数的整个堆栈大小向下调整 - 堆栈通常从较高地址向较低地址增长。
每个局部变量都在当前堆栈帧中分配了一个地址,并且通常使用内存访问指令访问它们,这些指令读取或写入具有当前堆栈指针的给定偏移量的内存。
然而,在优化的构建中,局部变量通常也保存在 CPU 寄存器中(只要有足够的寄存器可用)并且根本不必存储在内存中。这样做的目的是避免内存访问以加快程序速度。寄存器分配(编译器选择将哪些变量存储在寄存器中以及将哪个寄存器用于哪个变量)取决于编译器分析变量的生命周期及其使用量的大量黑魔法。
如果我们谈论静态内存分配,据说它是在编译时分配的,但实际上编译器只是处理这个内存分配,它实际上只在程序开始时分配。例如,编译器可能会在编译后的二进制文件中创建一个大的 data
段,当程序加载到内存中时,程序 data
段内的地址将用作分配内存的位置.
如果我谈论自动内存分配,它是在控件进入新范围时分配的。现在我的疑问是,在这种情况下,编译器是否也会出现并将一些虚拟地址传递到编译后的二进制文件中,这些地址后来成为 运行 期间实际分配内存的地址,或者该内存仅在 运行 分配没有任何编译器作用的时间就像分配动态内存的方式一样?
如果我有一些像这样的局部变量怎么办:
int a = 10;
它会有编译时分配还是运行时间分配?
自动分配发生在 run-time,尽管它的性质非常 system-specific。自动存储持续时间变量可能最终进入寄存器、堆栈或完全优化。
如果它们最终进入堆栈,编译器会为分配变量的函数创建局部作用域偏移量。也就是说,该变量可能被称为 SP + 8
或类似的东西,其中 SP 是堆栈指针。当函数被输入时,它又可以保存任何值——编译器或机器代码不知道或不关心它,这就是堆栈溢出存在的原因。
您可能会发现这很有用:What gets allocated on the stack and the heap?。
局部变量在内存中存储时是放在栈上的。
通常,函数的总堆栈大小要求是在编译时计算的。 然后,当进入一个函数时,堆栈指针会根据函数的整个堆栈大小向下调整 - 堆栈通常从较高地址向较低地址增长。
每个局部变量都在当前堆栈帧中分配了一个地址,并且通常使用内存访问指令访问它们,这些指令读取或写入具有当前堆栈指针的给定偏移量的内存。
然而,在优化的构建中,局部变量通常也保存在 CPU 寄存器中(只要有足够的寄存器可用)并且根本不必存储在内存中。这样做的目的是避免内存访问以加快程序速度。寄存器分配(编译器选择将哪些变量存储在寄存器中以及将哪个寄存器用于哪个变量)取决于编译器分析变量的生命周期及其使用量的大量黑魔法。