C语言 哪些内存位置用于变量存储



像javascript这样的高级语言不会给程序员一个选择存储变量的位置。但是C有。我的问题是:是否有任何指导方针,在哪里存储变量,例如依赖大小,使用等

据我所知,有三个可能的存储位置数据(不包括用于实际代码的代码段):

  1. 数据段
  2. 堆栈
所以短暂的小数据项应该存储在堆栈上吗?

函数之间必须共享的数据项怎么办?这些项可以存储在堆中,也可以存储在数据段中。你怎么样?决定选择哪一个?

你看错望远镜了。您不需要指定存储变量的特定内存段(特别是因为"内存段"的概念是高度依赖于平台的)。

在C代码中,你决定一个变量的生存期可见性可修改性基于什么对代码有意义,并基于编译器将生成机器码来存储对象在适当的段(如果适用)

例如,在文件作用域中(在任何函数之外)或使用关键字static声明的任何变量将具有静态存储持续时间,这意味着它们在程序启动时被分配并保持到程序终止;这些对象可以在数据段或BSS段中分配。在没有static关键字的函数或块中声明的变量具有自动存储持续时间,并且(通常)在堆栈上分配。

字符串字面值和其他编译时常量对象通常(但不总是!)在只读段中分配。数字字面值(如3.14159)和字符常量(如'A')不是对象,并且(通常)没有为它们分配内存;相反,这些值直接嵌入到机器代码指令中。

堆是为动态存储保留的,而变量不存储在那里;相反,您可以使用像malloc这样的库调用在运行时获取堆的一块,并将结果指针值分配给如上所述分配的变量。变量将存在于堆栈或数据段中,而它指向的内存存在于堆中。

理想情况下,函数应该只通过参数、返回值和异常(在适用的情况下)进行通信;函数不应该通过外部变量(即全局变量)共享数据。函数参数通常在堆栈上分配,尽管有些平台可能通过寄存器传递参数。

如果局部/堆栈变量很小,并且在相对较小/有限的范围内经常使用,则应该使用局部/堆栈变量而不是全局或堆变量。这将给编译器更多的机会来优化使用它们的代码,因为它知道它们不会在函数调用之间改变,除非你传递指针给它们。

此外,堆栈通常相对较小,在其上分配大型结构或数组可能导致堆栈溢出,特别是在递归代码中。

另一件要考虑的事情是在多线程程序中使用全局变量。你想要最小化竞争条件的机会,其中一个策略是通过不直接在函数中使用任何全局资源来使函数线程安全和可重入(如果malloc()是线程安全的,如果errno是单线程的,等等,你当然可以使用它们)。

顺便说一句,使用局部变量代替全局变量还可以提高代码的可读性,因为变量位于使用它们的地方附近,您可以快速找到它们的类型以及它们在哪里和如何使用。

除此之外,如果您的代码是正确的,那么将变量设置为局部变量或全局变量或堆变量之间应该没有太大的实际区别(当然,malloc()可能会失败,您应该记住它:)。

C只允许指定数据的间接存储位置…通过变量的作用域和/或分配。例如,函数的局部变量通常是堆栈变量,除非它被声明为静态,在这种情况下它可能是DATA/BSS。通过new/malloc动态创建的变量通常是heap。

然而,没有任何保证…只有它的含义。

也就是说,在函数中声明大的局部变量肯定是一个坏主意…奇怪错误和堆栈溢出的常见来源。非常大的数组和结构最适合动态分配,并根据需要将指针保持在局部/全局。

最新更新