社区
C语言
帖子详情
面试题:static和const的区别
czbever
2008-11-25 10:04:31
如题 请教各位
...全文
1006
18
打赏
收藏
面试题:static和const的区别
如题 请教各位
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
布拉格曼
2010-02-18
打赏
举报
回复
这个问题问的好,正好是我想了解的,估计提出这个问题的公司,对来应聘的人要求不低吧?
spofmy
2008-11-26
打赏
举报
回复
[Quote=引用 1 楼 ztz0223 的回复:]
static的用法:
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。
静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。
用法1:函数内部声明的static变量,可作为对象间的一种通信机制
如果一局部变量被声明为static,那么将只有唯一的一个静态分配…
[/Quote]
Up
hai040
2008-11-26
打赏
举报
回复
[Quote=引用 8 楼 matrixcl 的回复:]
感觉出题人有点傻,直接问const是什么static是什么不就行了。这两个没有共同点,何来区别
[/Quote]
up
matrixcl
2008-11-26
打赏
举报
回复
感觉出题人有点傻,直接问const是什么static是什么不就行了。这两个没有共同点,何来区别
cenyunlin
2008-11-26
打赏
举报
回复
对于C/C++语言来讲,
const就是只读的意思,只在声明中使用;
static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;
对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见.
static const 应该就是上面两者的合集.
下面分别说明:
全局:
const,只读的全局变量,其值不可修改.
static,规定此全局变量只在当前模块(文件)中可见.
static const,既是只读的,又是只在当前模块中可见的.
文件:
文件指针可当作一个变量来看,与上面所说类似.
函数:
const,返回只读变量的函数.
static,规定此函数只在当前模块可见.
类:
const,一般不修饰类,(在VC6.0中试了一下,修饰类没啥作用)
static,C++中似乎没有静态类这个说法,一般还是拿类当特殊的变量来看.C#中有静态类的详细说明,且用法与普通类大不相同.
wskyo
2008-11-26
打赏
举报
回复
做个标记
jinjiankla
2008-11-26
打赏
举报
回复
up
liubingqian
2008-11-26
打赏
举报
回复
这是白吃题目,还是别去这样的公司了。这完全是两个不同的东西。
guixian310
2008-11-26
打赏
举报
回复
你就这么理解
static int i=0;//i还能改变,比如i++,只不过之后i的值就一直是1了
const int i = 0//i再也不能动了,只能是0了
cyj626
2008-11-26
打赏
举报
回复
有共同点,都是关键字 O(∩_∩)O哈哈~
canican
2008-11-26
打赏
举报
回复
[Quote=引用 7 楼 cenyunlin 的回复:]
对于C/C++语言来讲,
const就是只读的意思,只在声明中使用;
static一般有2个作用,规定作用域和存储方式.对于局部变量,static规定其为静态存储方式,每次调用的初始值为上一次调用的值,调用结束后存储空间不释放;
对于全局变量,如果以文件划分作用域的话,此变量只在当前文件可见;对于static函数也是在当前模块内函数可见.
static const 应该就是上面两者的合集.
下面分别说明:
全局:
const,只读的全局变量,其值不可修改.
st…
[/Quote]
up
linuw
2008-11-26
打赏
举报
回复
[Quote=引用 8 楼 matrixcl 的回复:]
感觉出题人有点傻,直接问const是什么static是什么不就行了。这两个没有共同点,何来区别
[/Quote]
up
wwmwenzhu
2008-11-26
打赏
举报
回复
up
Qlaiaqu
2008-11-25
打赏
举报
回复
static
修饰全局变量和函数,说明作用域为文件可见
修饰局部变量说明此变量只在静态内存中分配,生存时间与程序一样长,只赋值只有一次。
const 约定我是固定量,当第一次赋值之后,今后谁也不能改变我。具体用法就是上面的。
比如常量指针和指针常量的区别
详细资料在楼上
C_Plus87
2008-11-25
打赏
举报
回复
希望在通俗点,呵呵
学习
yuanhong2910
2008-11-25
打赏
举报
回复
五大内存分区(转载某个朋友的)
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局静态存储区和常量存储区。
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
全局静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
明确区分堆与栈
在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。
首先,我们举一个例子:
void f() { int p=new int[5]; }
这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:
00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax
这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是delete p么?澳,错了,应该是delete []p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。
好了,我们回到我们的主题:堆和栈究竟有什么区别?
主要的区别由以下几点:
1、管理方式不同;
2、空间大小不同;
3、能否产生碎片不同;
4、生长方向不同;
5、分配方式不同;
6、分配效率不同;
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:
打开工程,依次操作菜单如下:Project-Setting-Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。
注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
碎片问题:对于堆来讲,频繁的newdelete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是CC++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
从这里我们可以看到,堆和栈相比,由于大量newdelete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。
虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。
无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:)
对了,还有一件事,如果有人把堆栈合起来说,那它的意思是栈,可不是堆,呵呵,清楚了
qq675927952
2008-11-25
打赏
举报
回复
up
就呆在云上
2008-11-25
打赏
举报
回复
static的用法:
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。
静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。
用法1:函数内部声明的static变量,可作为对象间的一种通信机制
如果一局部变量被声明为static,那么将只有唯一的一个静态分配的对象,它被用于在该函数的所有调用中表示这个变量。这个对象将只在执行线程第一次到达它的定义时初始化。
用法2:局部静态对象
对于局部静态对象,构造函数是在控制线程第一次通过该对象的定义时调用。在程序结束时,局部静态对象的析构函数将按照他们被构造的相反顺序逐一调用,没有规定确切时间。
用法3:静态成员和静态成员函数
如果一个变量是类的一部分,但却不是该类的各个对象的一部分,它就被成为是一个static静态成员。一个static成员只有唯一的一份副本,而不像常规的非static成员那样在每个对象里各有一份副本。同理,一个需要访问类成员,而不需要针对特定对象去调用的函数,也被称为一个static成员函数。
类的静态成员函数只能访问类的静态成员(变量或函数)。
游戏开发的
面试题
要求.docx
游戏测试
面试题
游戏测试
面试题
一、C++ 一般来说,对于语言要求是擅长任意一门语言,但是游戏开发岗位,更偏向于C++。因此,这里整理了C++常问
面试题
。基础1. C和 C++ 的
区别
2. struct与class的
区别
3. new/delete与...
嵌入式软件开发
面试题
整理
本资源摘要信息涵盖了嵌入式软件开发面试中常见的问题和知识点,包括关键字volatile、
static
、
const
的含义和作用,变量修饰符的
区别
,函数指针、ISR、中断服务子程序、union和struct的
区别
,以及引用和指针的
区别
等...
计算机考研
面试题
### 计算机考研
面试题
解析 #### 预处理指令与常数声明 在计算机科学领域,预处理指令是编译器在正式编译前处理的一些特殊指令,`#define`是其中一种用于宏定义的指令。在
面试题
中提到的`#define SECONDS_PER_YEAR ...
cocos2d-x
面试题
cocos2d-x
面试题
cocos2d-x 是一个流行的开源游戏引擎,广泛应用于游戏开发领域。以下是 cocos2d-x 相关的知识点总结: 1. New 和 malloc 的
区别
: New 和 malloc 都是用于申请动态内存和释放内存的,但是它们...
C++
面试题
(很经典)
当一个函数同时被
static
和
const
修饰时,编译器在实现
const
成员函数时会添加一个隐式的
const
this指针,但
static
成员函数没有this指针,这导致两者的语义冲突。 题目(二):不同类的sizeof结果? 输出是1, 1, 4。类...
C语言
70,037
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章