当我唯一关心的是大小时,使用全局变量而不是 malloc() 是否有缺点?

Is there a disadvantage to using a global variable instead of malloc() when my only concern is size?

根据我的理解,当

时,动态分配优于声明局部变量
  1. 与堆栈大小相比,您需要分配大量数据,and/or
  2. 您想动态控制它的持续时间。

但是 AFAIK 全局变量分配在数据段上,与堆栈相比也相当大。 假设我有一个大变量,它的生命周期将贯穿整个程序,而关注的只是它的大小。全局声明它而不是调用 malloc 是否还有任何缺点?

人们经常警告说全局变量是邪恶的,因为它们使代码变得复杂和不清楚,但我认为我不应该关心这个,因为在我的例子中文件范围很小。

术语“全局变量”不是很有用,因为它实际上意味着全局命名空间中随处可访问的东西。这样的变量肯定是不好的,应该始终避免。

相反,我们可以在 文件范围 声明一个变量而不使其成为全局变量,方法是添加 static 内部链接 外部链接)。一旦完成,整个“全局变量不好”的讨论就无关紧要了——变量现在只能从声明它的翻译单元访问。

反对在文件范围内使用 static int array[n]; 的另一个有效问题是线程安全。如果多个线程使用这样的数组,则可能必须防止竞争条件。但是将它变成动态的并不能解决这个问题:要么你需要从多个线程访问整个数组,在这种情况下你无论如何都需要保护。或者您只需要从多个线程访问数组的不同部分,以防您不需要保护。不管它是如何分配的。

考虑到这些因素,在文件范围内声明 static int array[n]; 并在 .data/.bss 处分配(如果适合的话)并没有错。事实上,与动态分配相比,这样做有很多很大的优势:没有碎片,没有分配开销,没有内存泄漏。