当我唯一关心的是大小时,使用全局变量而不是 malloc() 是否有缺点?
根据我的理解,动态分配比声明局部变量更可取
- 与堆栈大小相比,您需要分配大量数据,和/或
- 你想动态控制它的持续时间。
但是 AFAIK 全局变量分配在数据段上,与堆栈相比也相当大。假设我有一个很大的变量,它的生命周期将贯穿整个程序,并且关注的只是它的大小。全局声明它而不是调用它还有什么缺点malloc吗?
人们经常警告说全局变量是邪恶的,因为它们使代码变得复杂和不清楚,但我认为我不应该关心这一点,因为在我的情况下文件范围很小。
回答
术语“全局变量”并不是很有用,因为它实际上意味着可以随处访问的全局命名空间中的某些内容。这样的变量绝对是不好的,应该始终避免。
相反,我们可以通过添加(内部链接而不是外部链接)在文件范围内声明一个变量而不使其成为全局变量。一旦完成,整个“全局变量不好”的讨论就无关紧要了——变量现在只能从声明它的翻译单元访问。static
另一个反对拥有static int array[n];at 文件范围的有效问题是线程安全。如果多个线程使用这样的数组,则可能必须防止竞争条件。但是将它动态化并不能解决这个问题:要么你需要从多个线程访问整个数组,在这种情况下你无论如何都需要保护。或者您只需要从多个线程访问数组的不同部分,以防您不需要保护。不管它是如何分配的。
考虑到这些事情,static int array[n];在文件范围内声明并在.data/分配.bss(如果它适合)并没有错。事实上,与动态分配相比,这样做有很多很大的优势:没有碎片,没有分配开销,没有内存泄漏。
THE END
二维码