什么是数据区?

Diw*_*kar 2 c++ memory storage static

在C++中,存储类说明符static从数据区域分配内存."数据区"是什么意思?

Kon*_*lph 6

我不熟悉术语"数据区",但内存通常分为"代码段"和"数据段".代码驻留在前者中,后者中的数据.我认为这就是这里的含义.

传统上,两者之间没有区别.但是,许多现代操作系统可以禁止在数据段中执行代码(假设CPU支持这种区别).这有时会出现"NX标志"的口号,如"无执行",可以有效地防止某些恶意代码注入的情况.

/编辑:请注意,C++标准没有提到"数据区".


jan*_*anm 5

区域名称因平台,编译器和链接器而异.

一般来说,有:

  • 程序文本:可执行代码空间.
  • 常量:不可执行的常量.
  • stack:堆栈.
  • bss:广泛用C/C++术语表示"静态"."符号启动块"
  • 数据:未初始化的全局变量
  • heap:在运行时分配的存储.

在这种情况下,相关文档使用名称"数据区域"来表示传统上称为bss段的内容.

在C术语中,存储类说明符"静态"表示在程序的生命周期中存在的存储器,并且初始化为零或初始化器的值.在示例中:

static int s_value_one;
static int s_value_two = 123;
Run Code Online (Sandbox Code Playgroud)

s_value_one的值保证为零,并且s_value_type的值在main()中的第一个语句处为123.如何实现这一点是一个实施问题.


Sma*_*acL 5

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

如果您让编译器生成一个映射文件作为其输出的一部分,您可以查看所有不同部分(包括数据)中的内容。