在C和C++等编程语言中,人们经常提到静态和动态内存分配。我理解这个概念,但“编译时分配(保留)所有内存”这句话总是让我感到困惑。
据我所知,编译将高级C/C++代码转换为机器语言,并输出一个可执行文件。在编译后的文件中内存是如何“分配”的?内存不是总是与所有虚拟内存管理内容一起分配在RAM中吗?
按定义分配内存不是一个运行时概念吗?
如果我在C/C++代码中设置了一个1KB的静态分配变量,会不会使可执行文件的大小增加相同的量?
这是在“静态分配”标题下使用该短语的页面之一。
发布于 2014-01-25 20:30:07
可执行文件描述为静态变量分配的空间。当您运行可执行文件时,此分配由系统完成。因此,1kB的静态变量不会增加1kb的可执行文件的大小:
static char[1024];
当然,除非您指定了初始化器:
static char[1024] = { 1, 2, 3, 4, ... };
因此,除了“机器语言”(即CPU指令)之外,可执行文件还包含对所需内存布局的描述。
发布于 2014-01-25 22:10:36
你是正确的。内存实际上是在加载时分配(分页)的,即当可执行文件被放入(虚拟)内存时。内存也可以在那个时刻初始化。编译器只是创建了一个内存映射。顺便说一下,堆栈和堆空间也是在加载时分配的!
发布于 2014-01-26 04:45:00
我觉得你应该退后一步。编译时分配的内存...这意味着什么呢?这是否意味着尚未制造的芯片上的内存正在以某种方式保留给尚未设计的计算机?不是的。不,时间旅行,没有可以操纵宇宙的编译器。
因此,这一定意味着编译器在运行时以某种方式生成指令来分配内存。但是如果你从正确的角度来看,编译器会生成所有的指令,所以有什么不同呢?不同之处在于编译器决定,并且在运行时,您的代码不能改变或修改其决定。如果它在编译时决定需要50个字节,那么在运行时,您不能让它决定分配60个字节--这个决定已经做出。
https://stackoverflow.com/questions/21350478
复制相似问题