首先我们讨论应该是针对于C++而言,因为在C语言中,const没有什么作用,更像是一个标记来标记某个变量是否可变。所以在C语言中,只要带static必定是存在静态/全局区中。
其次,我们讨论在C++中的情况。首先有一个概念需要了解,在C++中,常量储存在常量存储区,而常量存储区是放在代码段中的,“不占内存”。而静态变量储存在静态/全局区,静态/全局区是在内存空间中的,在其所属的类中是全局的。
上面我们所说的常量存储区放在代码中不占内存一定是有争议的。这里的话,又有一个概念即动态的内存和静态的内存之间的区别。以win32程序为例。程序执行时,操作系统将exe文件映射入内存。exe文件格式为头数据和各段数据组成。头数据说明了exe文件的属性和执行环境,段数据又分为数据段,代码段,资源段等,段的多少和位置由头数据说明。也就是说,不仅仅只是代码段和数据段。这些段由不同的编译环境和编译参数控制,由编译器自动生成exe的段和文件格式。当操作系统执行exe时,会动态建立堆栈段,它是动态的,并且属于操作系统执行环境。也就是说,程序在内存的映射一个为exe文件映射,包括数据段、代码段等它是不变的。另一个为堆栈段,它是随程序运行动态改变的。所以说,上面的不占内存,并不是说真的不占内存,而是说由于全局变量存在全局区中,即代码段中,而代码段所用的内存区域的大小并不会随着全局变量的多少而改变,所以说一个全局变量在代码段中不占内存是可以的。如自定义的变量等,使用的是堆栈区,堆栈区的大小会随着变量的不断增加而增加,所以说是“占内存的“。
接下来就是最后一个问题,就是静态常量到底是存储在那一片内存区域?这里的话我还是盗用他人的调查结果,网上的也是杂七杂八的,但一般来说只要是静态的都在静态/全局区中(太懒了,没有调查没有发言权QAQ)
结果是静态常量和常量静态基本的用法/初始化等是没有区别的,且都存储在静态/常量区。