在C ++中,存储类说明符static从数据区域分配内存。 “数据区”是什么意思?
答案 0 :(得分:6)
我不熟悉术语“数据区”,但内存通常分为“代码段”和“数据段”。代码驻留在前者中,后者中的数据。我认为这就是这里的意思。
经典地说,两者之间没有区别。但是,许多现代操作系统可以禁止在数据段中执行代码(假设CPU支持这种区别)。这有时会出现“NX flag”的口号,如“无执行”,可以有效地防止某些恶意代码注入。
/编辑:请注意,C ++标准没有提到“数据区”。
答案 1 :(得分:5)
区域名称因平台,编译器和链接器而异。
一般来说,有:
在这种情况下,相关文档使用名称“数据区”来表示传统上称为bss段的内容。
在C术语中,存储类说明符“静态”表示存在于程序生命周期内的内存,并初始化为零或初始化程序的值。在示例中:
static int s_value_one;
static int s_value_two = 123;
s_value_one的值保证为零,并且s_value_type的值在main()中的第一个语句处为123。如何实现这一点是一个实施问题。
答案 2 :(得分:3)
除了Konrad所说的,将变量声明为静态基本上意味着它的内存在加载时与程序一起分配,而不是在堆或堆栈上。从历史上看,在关键应用程序中仅使用静态变量意味着应用程序的内存占用量不会在运行时更改,因此由于资源限制而不太可能发生故障。不知道现代操作系统是否仍然如此。
如果让编译器生成mapfile作为其输出的一部分,您可以查看所有各个部分的内容,包括数据。
答案 3 :(得分:1)
康拉德说的话。
我想补充的是,如果将数据放在代码部分中,那么仍然存在无法读取数据的CPU,反之亦然。这些在几十年前更为常见,但它们在嵌入式世界中仍然存在。
简而言之,链接器只是将相同类型的符号组合在一起。在PC上,您通常拥有的不仅仅是简单的代码和数据区域。您还可以找到未初始化数据,只读数据和其他操作系统相关内容的区域。
答案 4 :(得分:0)
通过谷歌搜索,我在这里找到了有关这些主题的更多信息:
答案 5 :(得分:0)
有很多地方数据可能会结束。通常,局部变量在堆栈上分配,您可以使用malloc(或默认版本的“new”)在堆上分配内容。但是,静态数据通常在程序启动时分配,并可能在任何地方结束 - 完全取决于编译器,操作系统和可执行格式。
答案 6 :(得分:0)
可执行文件中包含大量信息。
可执行文件,在其物理文件中存储了许多类型/类别的数据。
例如
等
需要某种方式来组织
.exe文件格式内的所有这些信息,以便操作系统可以轻松找到所有信息并加载可执行文件并使工作正常。为此,在windows世界中使用了一个名为PE(可移植的可执行文件)的通用二进制格式(由M $ of course创建)。我刚才列出的所有信息(以及更多)都在二进制文件的不同部分详细描述。
.data部分
一个这样的部分是.data部分。 .data部分包含所有初始化的全局和静态数据,而.bss部分包含未初始化的全局数据。
为什么你需要一个单独的全局变量部分?
嗯,全局行为类似于全局,因为它是在程序生命周期中存在的内存区域中创建的,而不是像堆栈那样可能被覆盖/重用的临时数据结构。 (像普通的自动变量一样)。
编译
因此,需要在堆中的某个永久地址中分配这些变量,遗憾的是,在编译时无法知道这些变量。因此编译器将所有全局变量和静态变量放在此.data / .bss部分中,引用这些变量的指令引用.data / .bss中的这些相对永久的地址。
<强>链接器强>
当链接器在现实世界中加载可执行文件时,它决定必须放置这些部分的位置并为这些临时地址创建FIX UP,以便引用全局变量的指令引用程序中现在的真实虚拟地址记忆。
现在您知道.data部分/区域是什么以及为什么需要在该区域中分配一些空间以及如何实时帮助该程序。谷歌搜索PE格式和链接器和.data部分等将为您提供链接。
答案 7 :(得分:-3)
我认为'数据区'指的是堆,而局部变量通常位于堆栈上。
或者它意味着为此变量分配的内存位于可执行文件的.data部分,但这将特定于Windows和PE格式。