C++的存储类说明符静态存储器将分配从数据的区域。什么是"数据领域"的意思吗?

有帮助吗?

解决方案

除了Konrad所说的,将变量声明为静态基本上意味着它的内存在加载时与程序一起分配,而不是在堆或堆栈上。从历史上看,在关键应用程序中仅使用静态变量意味着应用程序的内存占用量不会在运行时更改,因此由于资源限制而不太可能发生故障。不知道现代操作系统是否仍然如此。

如果让编译器生成mapfile作为其输出的一部分,您可以查看所有各个部分的内容,包括数据。

其他提示

我不熟悉术语“数据区”但记忆通常分为“代码部分“和“数据部分”。代码驻留在前者中,后者中的数据。我认为这就是这里的意思。

经典地说,两者之间没有区别。但是,许多现代操作系统可以禁止在数据段中执行代码(假设CPU支持这种区别)。这有时会出现在“ NX flag”的口号中,如在“没有执行”并且可以有效地防止一些恶意代码注入的情况。

/编辑:请注意,C ++标准未提及“数据区”。

名称的地区有所不同平台,编译器和接头。

在一般情况下,主要有:

  • 节目的文字:可执行代码的空间。
  • constants:不可执行的常数。
  • 栈:堆。
  • bss:广泛的"静态"在C/C++的条款。"框开始通过符号"
  • 数据:未初始化globals
  • 堆:储存分配在运行时间。

在这种情况下的文件在的问题是使用的名称是"数据领域"对于什么是传统上被称为bss段。

在C条款,储存流的说明"静态"装置存储器中存在的整个生命周期内的程序和初始化为零或价值initialiser.在这个例子:

static int s_value_one;
static int s_value_two = 123;

值s_value_one保证是零和的价值s_value_type是123点的第一份声明,在主要().如何这都是真的是一个执行问题。

康拉德说的话。

我想补充的是,如果将数据放在代码部分中,那么仍然存在无法读取数据的CPU,反之亦然。这些在几十年前更为常见,但它们在嵌入式世界中仍然存在。

简而言之,链接器只是将相同类型的符号组合在一起。在PC上,您通常拥有的不仅仅是简单的代码和数据区域。您还可以找到未初始化数据,只读数据和其他操作系统相关内容的区域。

有点我在谷歌上搜索发现了更多的信息,这些问题在这里:

有很多地方数据可能会结束。通常,局部变量在堆栈上分配,您可以使用malloc(或默认版本的“new”)在堆上分配内容。但是,静态数据通常在程序启动时分配,并可能在任何地方结束 - 完全取决于编译器,操作系统和可执行格式。

可执行的拥有大量的信息。

一个可执行的,有许多种类/类别的数据存储在其物理文件。

例如是

  1. 可执行代码说明
  2. 资源
  3. 依赖信息(其dll这种二分取决于)
  4. 符号,出口从这个二元

等等

还需要以某种方式来组织

所有这些信息内。执行文件的格式,这样的操作系统可以很容易地找到所有的信息和载荷的可执行的,并得到的东西的工作。为此目的一个共同的二元格式(创建的通过万美元的课程)称为PE(便携式可执行)中使用的windows的世界。所有信息我只是列出(并更多)详细描述在不同的部分的二进制的。

.数据的部分

这样的一个部分。数据部分。。数据部分包含的所有初始化的全球和静态数据,而.bss部分包含的初始化的全球数据。

为什么你需要一个单独的部分globals?

嗯,一个全球性的行为就像一个全球性的,因为它是建立在一个区域的存储器中存在的整个生命周期内的一个程序并不是一个临时的数据结构像一堆可能被复盖/再利用。(像正常的汽车变量)。

编译器

因此,这些变量需要被分配在某些永久的地址堆中,不幸的是,无法知道当时的汇编。因此编译器的地方所有的全球和静态变量。数据/.bss部分,并说明参照这些变量的参考这些相对永久地址。数据/.bss。

接头

当连接加载的可执行在现实世界中,它决定这些部分必须被安置和创造解决上升为这些临时地址,这样的说明是指全局参考,现在真正的虚拟地址在该程序的存储器。

现在你知道什么。数据节/区域是为什么globals需要分配一些空间,在这一领域和如何帮助的程序,在现实的时间。谷歌上搜索PE格式和链接。数据部分的等会得到你的链接。

我认为'数据区'指的是堆,而局部变量通常位于堆栈上。

或者它意味着为此变量分配的内存位于可执行文件的.data部分,但这将特定于Windows和PE格式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top