c++ 编译如何在堆栈中保留空间?[已关闭]

62lalag4  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(119)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

昨天关门了。
Improve this question
我对计算机没有多少了解,所以我的问题很幼稚。
我了解到C代码的编译在编译过程中会在主内存的堆栈中保留特定的内存空间。
然后,
1.为什么可执行文件在一台计算机上编译并复制到另一台计算机上时仍能正常工作?
1.如果编译保留RAM的特定内存位置,那么可执行文件(或编译)的数量是否受RAM大小的限制?
1.如果编译在RAM中保留空间,为什么可执行文件比预编译的. c文本文件占用更多的磁盘空间?
谢谢

pes8fvy9

pes8fvy91#

1.编译器在编译时并不“保留”堆栈。它的保留是指编译器将特定命令和指令插入到可执行文件中,以便在加载/运行可执行文件时保留堆栈
1.不可以。请参阅上文。RAM在编译时不被保留(即其他可执行文件不可用)。它在可执行文件被加载/执行时被保留。
1.这不一定是真的。在许多情况下,可执行文件比代码小。但这可能取决于许多因素,如代码的编写方式、可执行文件的格式、其中包含的元数据和内存布局。有时,可执行文件将包含整个零填充部分,这可以由代码中的一行定义。
一般来说,一个编译器(如果我们想卖弄学问的话,可以和链接器一起使用)只有一个“简单”的工作--获取输入文件(代码)并生成输出文件--可执行文件。也就是说,它创建文件,这些文件只占用文件系统中的空间。其他事情只有在环境(OS)加载并对它们做 * 某事 *(加载、执行)时才会发生。

fnatzsnv

fnatzsnv2#

在编译过程中不保留空间。在编译过程中,会生成一些指令,这些指令在运行时执行时将占用堆栈上的空间。
例如,在代码中声明变量时:

int x = 5;

编译器会发出将4个字节(假设是int的大小)压入堆栈的指令,但这是在运行时发生的,当运行时到达这一行代码时,该空间被保留,这里的警告是,优化编译器可以在这里做各种事情,并且可能实际上不分配堆栈空间。
当您将可执行文件复制到另一台机器时,它会工作,因为在执行代码时,堆栈保留将在该机器上发生。
一次可以运行的可执行文件的数量将取决于内存的数量。注意,如果内存不足,许多操作系统将在RAM和可用硬盘之间交换内存。这将增加可以运行的可执行文件的数量,但当发生这种情况时,系统通常会变慢很多。

相关问题