当我在C / C ++中查看内存组织和存储时,我发现了这个:
“初始化数据段,通常简称为数据段。数据段是程序虚拟地址空间的一部分,包含由程序员初始化的全局变量和静态变量。
请注意,数据段不是只读的,因为变量的值可以在运行时更改。“
(见http://www.geeksforgeeks.org/memory-layout-of-c-program/)
我的印象是静态和/或全局变量在整个应用程序中保持不变,我认为这是它们存在的重点。他们真的可以在运行时改变吗?
答案 0 :(得分:5)
他们真的可以在运行时改变吗?
是。当然,除非你将它们声明为const
。
我的印象是静态和/或全局变量 在整个应用程序中保持不变,我认为这是 他们存在的意义。
不,你在描述常数。具有所谓静态存储持续时间的变量具有名称所暗示的不同生命周期。 [basic.stc.static]:
没有动态存储持续时间的所有变量都没有 线程存储持续时间,并且不是本地的静态存储 持续时间。 这些实体的存储应持续一段时间 该计划(3.6.2,3.6.3)。
只需考虑cout
,即通过向其中插入数据来修改的全局流对象。
答案 1 :(得分:2)
您通常会在更多人对更新感兴趣的网站上找到更好的文档,例如 - from Wikipedia:
在计算中,数据段(通常表示为
.data
)是目标文件的一部分或包含初始化静态变量的程序的相应虚拟地址空间,即全局变量和静态局部变量。此段的大小由程序源代码中值的大小决定,并且在运行时不会更改。数据段是读写 ,因为变量的值可以在运行时更改。这是 与只读数据段 (
rodata
段或.rodata
)形成对比,后者包含静态常量而非变量;它还与code
段(也称为text
段形成对比,后者在许多体系结构上都是只读的。未初始化的数据,包括变量和常量,都在BSS
段中。
所以,这只是一个定义问题:
数据段包含读写变量
"只读"数据段包含常量
在一些旧的/曲棍球系统上,他们可能不会同时使用只读数据段并将它们全部混合在一起 - 只读段的主要内容是它意味着更多的错误报告更多,而不是让该程序破坏了数据并可能导致虚假结果。这可能是为什么.data
是一般性的,以后的某个时间 - 因为操作系统/编译器编写者有时间和动力去关心 - .rodata
最终与它形成对比,但.data
不是&# 39; t重命名为eg .rwdata
。这些名称 - .data
,.rodata
,test
,BSS
等通常用于汇编语言,以表示变量的位置。
就事情而言......全局变量和static
变量是相似的,因为它们的[可能虚拟]内存地址 - 实际上它们的总大小 - 通常可以计算(至少相对于某些在编译时支持CPU" segment"在大多数情况下以方便的值记录它们。这与存储器瞬态的自动(堆栈)和动态(堆)变量形成对比。大多数系统只能在每页的基础上控制对内存的写访问(例如4k,8k),因此保持授予和删除写访问权以使瞬态const
自动和基于堆的变量到内存中,对进程来说似乎是只读的,当你考虑线程应用程序中的竞争条件时,它是不切实际的。这就是为什么读写和只读存储器之间的这种区别通常在全局和静态变量的上下文中讨论的原因。