Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在静态全局区域中声明大型结构对象可以吗?_C_Memory_Struct - Fatal编程技术网

C 在静态全局区域中声明大型结构对象可以吗?

C 在静态全局区域中声明大型结构对象可以吗?,c,memory,struct,C,Memory,Struct,我正在考虑创建一个全局静态结构,如下所示: typedef结构{ 事物事物[1024]; }MyBigStruct; 静态mybigstructs; 在内存方面或者其他方面,为什么不将大型结构对象放在“静态全局区域”中呢?这个区域有限制吗?我应该在堆中用malloc声明它吗 请不要参考针对全局变量的编码实践,而只参考技术方面。在全局中声明的变量通常位于内存的数据段区域。这个区域没有与堆栈相同的大小限制(除了物理上可用的内存),因此全局声明大变量是非常好的 取决于这些变量的大小,您可能会在运行时

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

typedef结构{
事物事物[1024];
}MyBigStruct;
静态mybigstructs;
在内存方面或者其他方面,为什么不将大型结构对象放在“静态全局区域”中呢?这个区域有限制吗?我应该在堆中用
malloc
声明它吗


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

在全局中声明的变量通常位于内存的数据段区域。这个区域没有与堆栈相同的大小限制(除了物理上可用的内存),因此全局声明大变量是非常好的

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

为什么不把大型结构放在 “静态全局区域”中的对象

。以您描述的方式使用globals是非常好的,甚至在某些方面是有利的。(例如,在动态分配的运行时速度方面。
然而尽管与大小无关,但使用全局变量还有其他缺点。例如,在使用多个线程时,全局变量可能会出现问题。代码中访问全局变量的任何函数不再是线程安全函数的原则之一。如果应用程序中包含全局变量,则需要共享全局变量在线程之间创建全局对象

这个区域有限制吗?我应该向malloc申报吗 堆


,表示其大小仅受系统上可用的物理内存量限制。(有关物理内存限制的更详细讨论)

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