哪个内存位置用于变量存储

时间:2013-04-05 14:34:44

标签: c memory

javascript这样的高级语言不会给程序员带来麻烦 选择存储变量的位置。但是C确实如此。我的问题是: 是否有关于存储变量的位置的指导,例如依赖 尺寸,用途等

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

  1. 数据段
  2. 堆栈
  3. 那么瞬态小数据项应该存储在堆栈中吗?

    必须在功能之间共享的数据项怎么样?这些 项目可以存储在堆上或数据段中。你怎么 决定选择哪个?

3 个答案:

答案 0 :(得分:2)

当这些变量很小,经常使用并且在相对较小/有限的范围内时,您应该更喜欢本地/堆栈变量到全局变量或堆变量。这将为编译器提供更多使用它们来优化代码的机会,因为它知道它们不会在函数调用之间进行更改,除非您传递指向它们的指针。

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

要考虑的另一件事是在多线程程序中使用全局变量。您希望最大限度地减少竞争条件的可能性,并且通过不直接使用其中的任何全局资源(如果malloc()是线程安全的,如果errno,那么将其作为线程安全和重新进入的函数是每线程等,你当然可以使用它们。

顺便说一句,使用局部变量而不是全局变量也可以提高代码的可读性,因为变量位于使用它们的位置附近,您可以快速找到它们的类型以及它们的使用位置和方式。

除此之外,如果你的代码是正确的,那么在变量本地或全局或堆中之间应该没有太大的实际区别(当然,malloc()可能会失败,你应该记住它:)

答案 1 :(得分:2)

你正在通过望远镜的错误端看。您没有指定存储变量的特定内存段(特别是因为“内存段”的概念是高度平台相关)。

在C代码中,您根据对代码有意义的内容确定变量的生命周期可见性可修改性,并基于编译器将生成机器代码以将对象存储在适当的段中(如果适用)

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

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

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

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

答案 2 :(得分:0)

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

然而,并不能保证任何......只有它的含义。

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