首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >全局变量如何影响可执行文件的大小?

全局变量如何影响可执行文件的大小?
EN

Stack Overflow用户
提问于 2010-12-04 16:36:27
回答 4查看 4.9K关注 0票数 3

使用全局变量会增加可执行文件的大小吗?如果是,是如何实现的?它是只增加数据部分的大小,还是增加文本部分的大小?

如果我有一个全局变量和初始化,如下所示:

代码语言:javascript
运行
复制
char g_glbarr[1024] = {"jhgdasdghaKJSDGksgJKASDGHKDGAJKsdghkajdgaDGKAjdghaJKSDGHAjksdghJKDG"};

现在,这是否将1024添加到数据部分,并将初始化字符串的大小添加到文本部分?

如果相反,如果静态地为这个数组分配空间,如果我错误地锁定它,然后执行memcpy,那么只有数据部分的大小会减少,或者文本部分的大小也会减少?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-04 16:49:49

是的,确实如此。基本上,编译器将它们存储在数据段中。有时,如果你在代码中使用一个常量字符数组(比如printf("<1024 char array goes here");),它就会进入数据段(一些老的编译器/Borland?/可能会把它存储在文本段中)。您可以强制编译器将全局变量放在自定义部分中(对于VC++,它是#pragma data_seg(<segment name>))。

动态内存分配不会影响数据/文本段,因为它在堆中分配内存。

票数 6
EN

Stack Overflow用户

发布于 2010-12-04 23:55:34

答案取决于实现,但对于sane实现,这是它对具有静态存储持续时间(全局或其他)的变量的工作方式:

  • 每当初始化变量时,对象的整个初始化值都将存储在可执行文件中。这是正确的,即使只有它的初始部分被显式初始化(其余部分隐式为零)。
  • 如果变量是常量且已初始化,则它将位于“文本”段或等效段中。一些系统(基于现代ELF,也许也是Windows?)具有用于只读数据的单独的“code.
  • Non-constant”段,以允许它被标记为不可执行,与程序分开。初始化的变量将在可执行文件中的“数据”段中,当程序为loaded.
  • Uninitialized时,由操作系统以写时复制模式将其映射到存储器中。变量(根据标准其隐含为零)将在可执行文件本身中不保留存储,而是在"bss“段中具有大小和偏移量,如果这些未初始化的变量是const-qualified.

的,则它们可以在单独的只读“bss”段中被创建(

  • -like
票数 3
EN

Stack Overflow用户

发布于 2010-12-04 16:40:45

我不是以专家的身份发言,但我猜测,在你的程序中简单地使用这个庞大的字符串文字会增加你的可执行文件的大小。您如何处理该字符串并不重要,因为它必须存储在某个地方。

为什么增加可执行文件的哪个“部分”很重要?这不是一个反问句!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4352682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档