c++ 基础2、那些年我们用过的static

说起 static 来 大家应该都不会陌生,因为我们都用过,这里我们在回顾一些它的用法,static 意味着静态,静态变量当然是属于静态存储方式,所以编译器在编译的时候就已经确认了该变量的存储方式,静态变量有静态局部变量和静态全局变量,那它的存储在进程当中的哪一个位置呢,首先我们需要知道,一个进程它分哪一些区。

1、进程的分区

进程为什么需要分区呢,因为方便统一管理,区域性的划分,进程里面包含 代码区、全局区、堆区、栈区、常量区

代码区:也就是我们的函数即代码块,存放函数的二进制代码,所以在运行期间只允许读,不能修改

全局区:分为初始化和未初始化

1、数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量

2、BSS :用于存储未初始化的全局变量

堆区:堆是由程序员分配和释放,用于存放进程运行中被动态分配的内存段,它大小并不固定,可动态扩张或缩减。当进程调用alloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用realse释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈区:栈是由编译器自动分配并释放,用户存放程序临时创建的局部变量,存放函数的参数值,局部变量等

上述几种内存区域中数据段、BSS和堆通常是被连续存储的——内存位置上是连续的,而代码段和栈往往会被独立存放。

栈是向低地址扩展的数据结构,是一块连续的内存的区域。堆是向高地址扩展的数据结构,是不连续的内存区域。有人会问堆和栈会不会碰到一起,他们之间间隔很大,绝少有机会能碰到一起,况且堆是链表方式存储

通过以上进程的内存布局你可以知道,static 修饰的存放在进程的哪一个区域里面了。

2、static 用法

1、一般修饰如下 静态局部变量  静态全局变量 静态成员函数 这三种方式,也比较简单,最主要的点是会限制文件的作用域。

///静态全局变量 限制文件作用域 当前文件
static int g_result = 0;

class chang {
public:
	chang() = default;
	~chang() = default;
	
	///修饰类传数 一般配被 & 意志传递进入的参数不被函数所修改,即不允许修改
	inline bool setValue(const int& va) {
		static int result = va;
		m_value = va;
		g_result = m_value;
		return true;
	}
	/// 修饰函数,表示不能修改类中数据成员也不能调用类的成员函数
	inline int getValue() const {
		return m_value;
	}
	static int getResult() {
		return g_result;
	}
private:
	/// 用muteable 修饰以允许该成员可以在常量函数中被修改
	mutable int m_value;
};

由于本人经验有限,如有错误,欢迎修正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值