静态和全局变量存储说明
Static and global variable storage clarification
当我在 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
、.rodata
、test
、BSS
等,过去和现在都经常在汇编语言中用于表示变量应该在哪里。
就事情而言...全局变量和static
变量是相似的,因为它们的[可能是虚拟的]内存地址 - 实际上是它们的总大小 - 通常可以在编译时计算(至少相对于一些支持CPU"段"寄存器,大多数时间都保持在方便的值(。 这与自动(堆栈(和动态(堆(变量形成对比,其中内存是瞬态的。 大多数系统只能控制每页对内存的写入访问(例如 4k、8k(,因此继续授予和删除写入访问权限以将瞬态const
自动和基于堆的变量放入对进程似乎是只读的内存中要不切实际,并且在考虑线程应用程序中的争用条件时是不切实际的。 这就是为什么读写内存和只读内存之间的整个区别通常在全局变量和静态变量的上下文中讨论。
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 当使用通配符和null指针调用函数时,对输出的说明
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 静态和全局变量存储说明
- 动态分配的内存存储说明