| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4946 人关注过本帖
标题:关于常量存储区的问题
取消只看楼主 加入收藏
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
 问题点数:0 回复次数:18 
关于常量存储区的问题

假设在某个函数里有如下定义:

(1) char *s="hello";
请问s存储在哪个区,"hello"存储在哪个区?

(2) const int a=10;
请问a存储在哪个区,10存储在哪个区?

(3)请问类常量对象的声明方法,下面的声明是否正确?并问类常量对象的存储区域?

A为类名
A ob1;
const A ob2=ob1;
const A ob3(ob1);

搜索更多相关主题的帖子: 常量 const hello 定义 声明 
2006-10-27 16:08
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
那个a是分配在哪个区啊?

2006-10-27 19:02
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
以下是引用wfpb在2006-10-27 19:48:58的发言:
const int a=10;
相当于#define a 10
别名

错了?

const int a=10;//这个a分配内存空间
#define a 10 //这个a不分配内存空间

不是吗?


2006-10-27 19:58
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
#define a 10

那你能把这个a的内存地址打印出来给我看看吗?

2006-10-27 20:06
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
所以我说它不分配内存空间啊

2006-10-27 20:10
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
再问一个,什么叫常量折叠啊

2006-10-27 20:13
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
哦,原来c和c++中的const的是不一样的.
我还一直以为是c中的const的.

C中const的意思是"一个不能被改变的普通变量" const常量总是占用存储而且它的名字是全局符.

而C++中并不一定要为const创建空间.
当用到extern const int bufsize;或取const地址时,才分配存储空间.

我说的没错吧?

[此贴子已经被作者于2006-10-27 20:26:48编辑过]


2006-10-27 20:25
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
那你觉得我17楼说的对不对啊?

2006-10-27 20:42
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
7.1.1 头文件里的const
与使用#define一样,使用const必须把const定义放进头文件里。这样,通过包含头文件,
可把const定义单独放在一个地方并把它分配给一个编译单元。C+ +中的const默认为内部连接,
也就是说,c o n s t仅在c o n s t被定义过的文件里才是可见的,而在连接时不能被其他编译单元看
到。当定义一个常量(c o n s t)时,必须赋一个值给它,除非用e x t e r n作了清楚的说明:
extern const bufsize;
虽然上面的e x t e r n强制进行了存储空间分配(另外还有一些情况,如取一个c o n s t的地址,也要
进行存储空间分配),但是C + +编译器通常并不为c o n s t分配存储空间,相反它把这个定义保存
在它的符号表里。当c o n s t被使用时,它在编译时会进行常量折叠。
当然,绝对不为任何c o n s t分配存储是不可能的,尤其对于复杂的结构。这种情况下,编译
器建立存储,这会阻止常量折叠。这就是c o n s t为什么必须默认内部连接,即连接仅在特别编
译单元内的原因;否则,由于众多的c o n s t在多个c p p文件内分配存储,容易引起连接错误,连
接程序在多个对象文件里看到同样的定义就会“抱怨”了。然而,因为c o n s t默认内部连接,
所以连接程序不会跨过编译单元连接那些定义,因此不会有冲突。对于在大量场合使用的内部
数据类型,包括常量表达式,编译器都能执行常量折叠。


7.1.4 与C语言的区别
常量引进是在早期的C + +版本中,当时标准C规范正在制订。那时,常量被看作是一个好
的思想而被包含在C中。但是,C中的c o n s t意思是“一个不能被改变的普通变量”,在C中,它
总是占用存储而且它的名字是全局符。C编译器不能把c o n s t看成一个编译期间的常量。在C中,
如果写:
const bufsize=100;
char buf[bufsize];
尽管看起来好像做了一件合理的事,但这将得到一个错误结果。因为b u f s i z e占用存储的某个地
方,所以C编译器不知道它在编译时的值。在C语言中可以选择这样书写:
const bufsize;
这样写在C + +中是不对的,而C编译器则把它作为一个声明,这个声明指明在别的地方有存储
分配。因为C默认c o n s t是外部连接的,C + +默认c o n s t是内部连接的,这样,如果在C + +中想完
成与C中同样的事情,必须用e x t e r n把连接改成外部连接:
extern const bufsize;//declaration only
这种方法也可用在C语言中。
在C语言中使用限定符c o n s t不是很有用,即使是在常数表达式里(必须在编译期间被求出)
想使用一个已命名的值,使用c o n s t也不是很有用的。C迫使程序员在预处理器里使用# d e f i n e。

2006-10-27 20:50
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 
以下是引用song4在2006-10-27 20:57:07的发言:

回25
你是问你说的那个const int t=10;
当然这个10是有空间的
任何东西都有空间
当c o n s t被使用时,它在编译时会进行常量折叠。
这句话,我的理解是 把t与10当成一个常量
而且现在他们俩个都在常量区的数据区

我觉得这个10不分配空间.

通常C++编译器并不为const创建存储空间,相反它把定义保存在它的符号表里.


2006-10-27 21:05
快速回复:关于常量存储区的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012585 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved