为什么局部变量初始化指令对可执行文件大小的影响不如全局变量?

问题描述 投票:0回答:1

我正在阅读的文字说:

全局变量位于可执行映像中,因此使用多个全局变量会增加可执行映像的大小。

问题:

  1. “位于可执行映像中”是什么意思? 据我所知,全局变量位于可执行文件的“数据”部分。我认为局部变量初始化指令存储在“文本”部分中。 那么为什么局部变量初始化指令不占用与全局变量相同的空间呢?

  2. 所谓的可执行文件,是指加载到内存中的可执行文件还是仅位于非易失性存储器上的可执行文件?全局变量是否也会为未加载到 RAM 中的可执行文件占用更多空间?

  3. 有没有我可以参考的书籍或简明阅读资源可以帮助我理解这些较低层次的概念?

我期望局部变量初始化指令的大小在可执行文件中占用与全局变量相同的空间量。考虑以下程序:

#include <stdlib.h>

int global_var = 10

int main(void){

    int local_var = 20;
    return EXIT_SUCCESS;
}

当转换为机器级可执行文件时(假设其未加载到内存/不是进程),我假设

global_var
local_var
的定义和初始化都将被编码为机器级代码,尽管在不同的部分(数据和文本) )的可执行文件。那么为什么
global_var
会占用更多空间呢?

c memory
1个回答
-1
投票

所有对象都会占用内存。如果它被初始化,它必须存储在某个地方。

但是,并非所有对象声明都是平等的。您的示例有一个

global_var
,它必须在程序中的某处具有可修改的已实现的
int
对象空间。这需要空间。

但是本地

local_var
很可能被编译器优化为不存在,因为编译器可以向自己证明它从未被使用过(或者仅在不需要在内存中任何位置实际存储
int
对象的上下文中使用) .

唯一需要的是初始值,它必须存在于程序中的某个位置。同样,由于

local_var
被省略,因此存储其初始值的要求也被省略。

© www.soinside.com 2019 - 2024. All rights reserved.