静态和全局变量存储说明

Static and global variable storage clarification

本文关键字:说明 存储 全局变量 静态      更新时间:2023-10-16

当我在 C/C++ 中查看内存组织和存储时,我遇到了这个问题:

"初始化的数据段,通常简称为数据段。数据段是程序虚拟地址空间的一部分,其中包含由程序员初始化的全局变量和静态变量。

请注意,数据段不是只读的,因为变量的值可以在运行时更改。

(在 http://www.geeksforgeeks.org/memory-layout-of-c-program/中找到(

我的印象是静态和/或全局变量在整个应用程序中保持不可变,我认为这就是它们存在的意义所在。它们真的可以在运行时更改吗?

它们真的可以在运行时更改吗?

是的。当然,除非你宣布它们是const

我的印象是静态和/或全局变量 在整个应用程序中保持不可变,我认为这是 他们存在的意义。

不,您是在描述常量。顾名思义,具有所谓静态存储持续时间的变量具有不同的生存期。[basic.stc.static]:

所有没有动态存储持续时间的变量都没有 线程存储持续时间,并且不是本地有静态存储 持续时间这些实体的存储应持续一段时间 的程序(3.6.2,3.6.3(。

想想 cout ,一个全局流对象,您可以通过将数据插入其中来修改它。

您通常会在更多人有兴趣更新的网站上找到更好的文档,例如 - 来自维基百科:

在计算中,数据段(通常表示为.data(是包含初始化静态变量(即全局变量和静态局部变量(的程序的对象文件或相应虚拟地址空间的一部分。此段的大小由程序源代码中值的大小确定,在运行时不会更改。

数据段是读写的 ,因为变量的值可以在运行时更改。这与只读数据段(rodata段或.rodata(相反,后者包含静态常量而不是变量;它还与code段(也称为text段(形成对比,后者在许多体系结构上是只读的。未初始化的数据(变量和常量(位于BSS段中。

所以,这只是一个定义问题:

  • 数据段包含读写变量

  • "只读"数据段保存常量

在一些旧的/曲棍球系统上,它们可能不会同时使用只读数据段,而只是将它们全部混为一谈 - 只读段的主要问题是,这意味着更多的错误被更显着地报告,而不是让程序破坏该数据并可能喷出虚假结果。 这可能就是为什么.data是通用的,并且稍后 - 因为操作系统/编译器编写者有时间和动力去关心 - 最终.rodata与它形成对比,但.data没有重命名为例如 .rwdata . 这些名称 - .data.rodatatestBSS等,过去和现在都经常在汇编语言中用于表示变量应该在哪里。

就事情而言...全局变量和static变量是相似的,因为它们的[可能是虚拟的]内存地址 - 实际上是它们的总大小 - 通常可以在编译时计算(至少相对于一些支持CPU"段"寄存器,大多数时间都保持在方便的值(。 这与自动(堆栈(和动态(堆(变量形成对比,其中内存是瞬态的。 大多数系统只能控制每页对内存的写入访问(例如 4k、8k(,因此继续授予和删除写入访问权限以将瞬态const自动和基于堆的变量放入对进程似乎是只读的内存中要不切实际,并且在考虑线程应用程序中的争用条件时是不切实际的。 这就是为什么读写内存和只读内存之间的整个区别通常在全局变量和静态变量的上下文中讨论。