【发布时间】:2025-12-19 20:05:06
【问题描述】:
(为了这个问题,请忽略全局变量的优缺点。)
全局变量是否与动态分配的内存位于同一内存空间中?
例如,通常如果我有一个大型的数兆字节数据结构,我想在内存中使用,我 malloc() 我需要的数量并从那里使用结构指针。
我的问题是,这与将大型结构定义为全局结构之间有什么区别吗?我知道未初始化的全局变量的大小在对象 BSS 中定义,但实际上不会占用对象文件中的空间,因此从某种意义上说,它们是在运行时分配的。但是 BSS 定义的全局变量的大小是否有任何限制?它们是否以 malloc 以外的方式分配?
【问题讨论】:
-
这一切都将高度依赖系统。
-
BSS 段中的全局变量在模块加载时一次性全部分配。如果您计划在程序的整个生命周期中使用全部或大部分,这很好,但否则可能会造成浪费。
-
一切都是实现定义的。我知道在启动时从操作系统池中动态分配内存以将静态持续时间对象放在那里的实现。在这种情况下没有区别,因为使用了相同的分配机制。
-
定义“内存空间”。归根结底,由于现代内核如何虚拟化所有内容,因此许多这些差异只是学术性的。值得注意的是,2020年的“大”并不意味着“数兆”。我会为使用超过 20% 的系统内存或 4GB+ 的东西保留该术语,当然,如果您在一些受限的嵌入式环境中除外。如果是这种情况,您将需要具体说明您正在使用的架构和操作系统(如果有的话)。
-
如果这是您要的,它不在堆栈中。这仅适用于函数,其中包括
main()。
标签: c allocation