以下是引用embed_xuel在2012-7-28 12:45:02的发言:
常量区
……和静态存储区有区别吗?
常量区
梅尚程荀
马谭杨奚
不要区分静态存储和常量存储,还有个未初始化数据段BSS,这些都属于静态概念,也就是独立于栈存储和动态存储。普通的全局变量本身放在静态段,常量全局变量和字符串字面值放在常量存储,如果全局变量没有初始化,则放在BSS段,这个段很特殊,假如是初始化的全局变量(常量或者非常量)或者字面值,会可执行文件上占大小,但是BSS段的数据在可执行文件里只有一个段的起始地址和长度。在可执行文件加载进内存时,加载器会帮你在进程空间按指明长度申请一段内存,清为0,所以全局变量不初始化一般都是以0填充.常量全局变量和字面值占文件大小,当然,更占内存空间,加载器在加载时,会把这一部分内存设置为只读,所以,一般来说,强制修改一个const 全局变量是会发生内存访问违例的 int main(int argc, char* argv[]) { int i=1 ; const int j=2; int* p=new int[1]; return 0; } 这个例子举得不好。这个j是局部变量,是在栈上的,而栈是一个段,操作系统也不能说栈上的这几个字节可写,那几个字节不可写,毕竟这种内存属性至少针对一个页来的。而栈需要存储返回地址等信息,所以比如是要可写的。所以导致j也是可写的。所以这里的const j只是一个语法属性,在内存中j是没有const属性的。那BSS又属于谁?
姑且不论,编译在实现上是不是将 const 修饰的标志符放在符号表中! 当 用定 const 定义一个常量值时,它才是常量,是直接插入指令中的 用 const 定义一个指针变量时, 这个变量可不是一个常量值! 这个指针不是放在他所说的符号表中 const 变量存储在哪里与const 关键字无关, const 关键字是一个Type qualifiers,而决定变量存储的是Storage-class specifiers.