【问题标题】:Is it okay to declare large struct objects in the static-global area?在静态全局区域中声明大型结构对象可以吗?
【发布时间】:2019-09-16 04:24:30
【问题描述】:

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

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

static MyBigStruct s;

有什么理由,无论是内存还是其他,为什么不将大型结构对象放在“静态全局区域”中?这个区域有限制吗?我应该在堆中用malloc 声明这个吗?

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

【问题讨论】:

  • 这个领域怎么可能没有限制?
  • 一般来说,全局数据结构是一种不好的代码味道。它们制作了无法并行化的脆弱程序。例外情况是,如果这确实是一个静态常量:它的值永远不会改变。你的问题的其余部分没有一般的答案。正如@ScottHunter 所说,总是有限制的。它们完全是特定于环境的。小型嵌入式控制器将不同于大容量服务器。甚至对于给定的机器,操作系统和编译器都会获得投票。

标签: c memory struct


【解决方案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.)

    【讨论】:

      猜你喜欢
      • 2013-09-20
      • 2015-05-27
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 2011-05-09
      相关资源
      最近更新 更多