【类中的static变量在栈中吗?】

为什么会是true?

在静态区中,是一个独立的区域,和堆.栈并列的

数据区,跟全局变量等在一个sector

局部变量: 栈区
局部静态变量:静态区
全局变量: 静态区的常量区
全局静态变量:静态区

内存分四个区:静态区,栈区,堆区,代码区

当然不在,类中的一切变量都在堆上。堆栈上只有函数的局部变量。

这个其实很好理解,都不需要死记硬背,也不需要看书。
一说你就明白了。为什么要堆栈?因为函数允许嵌套调用,所以需要一种存储结构可以在调用下一层函数之前,保存当前函数的上下文,在内侧函数调用完成后,下层函数的存储又不需要。
所以需要先进后出的堆栈。很明显,别的场合都不需要。

内存分配区:
[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
[3]从堆上分配,亦称动态内存分配。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

C++语言中static的变量:
1).static局部变量
A、static成员变量设置初值的时候,不受任何权限的束缚。但是这里需要解释的是,并不是在任何时候都不受束缚,仅仅在赋初始值的时候不受权限束缚,如果是在中途改变static成员变量的值的话,必须是public类型的才能改变,否则编译错误。
这个static变量在初始化后,生存期为整个程序运行期间,该静态成员被类的所有对象所共享。即在内存中对所有的对象,只有一份。
例如:对配置文件的类,我们可以在里面定义一个它自身的静态成员对象指针。
这样,当我们要使用配置时,只用获取这个指针,就可以进行具体操作。
2).static全局变量
A、C++中的全局静态变量和C语言中的全局静态变量作用相同。

C++中关于静态成员的几点约束::
在const成员函数中,可以修改static成员变量的值。普通成员变量的值,是不能修改的。

从汇编语言的角度上看,static关键字就是把变量放入数据段中存储,而不是放入栈中。
所谓放入数据段中存储,意思就是只要你的程序没有退出,他就一直留在那里,保持上一次的值。
而放入栈中,则有可能因为函数的出栈等操作而被“干掉”(就算你的程序没有退出,他一样可能消失)。

C++中的全局静态变量和C语言中的全局静态变量作用相同