可以在static-global区域中声明大型struct对象吗?

时间:2019-04-26 16:03:30

标签: c memory struct

我正在考虑创建一个全局静态结构,如下所示:

typedef struct {
    Thing things[1024];
} MyBigStruct;

static MyBigStruct s;

从内存角度还是其他原因,为什么不将大型struct对象放在“ static-globals区域”中?这个区域有限制吗?我应该在堆中用malloc声明吗?

请不要参考针对全局变量的编码实践,而仅指技术方面。

2 个答案:

答案 0 :(得分:3)

全局声明的变量通常位于内存的数据段区域中。除了物理上可用的内存之外,该区域对堆栈的大小没有相同的限制,因此在全局范围内声明大变量是完全可以的。

取决于这些变量的大小,与使用动态分配相比,您可能会获得一点运行时收益,因为在程序启动时预留了此变量的空间,而不是从堆中分配此内存的运行时成本

答案 1 :(得分:2)

  

从内存角度还是其他原因,为什么不放置大型结构   “静态全局区域”中的对象?

。以您描述的方式使用全局变量是完全可以的,甚至在某些方面具有优势。 (例如,相对于动态分配的运行时速度而言。
,尽管与 size 没有关系,但使用全局变量还有其他缺点。例如,全局变量在使用多个线程时可能会出现问题。您代码中访问全局的任何函数都不再是 re-entrant ,它是线程安全函数的宗旨之一。如果您的应用程序中包含 multi-threading ,则需要 extra precautions 在线程之间共享全局对象。

  

该区域是否有限制?我应该在malloc中声明吗   堆?_

The data section of memory [is] for global and static data ... ,建议其大小仅受系统可用物理内存量的限制。 (关于物理内存限制的更详细讨论 can be found here.