C++中Const说明

最近在看程序员面试宝典,看到const这块感觉有很大疑惑,查了很多资料,可以总结如下:

1.在C语言中

在C语言中,const修饰的变量不具有常量的特性,只是一个不可修改的变量,实质上仍然是变量,在编译期间无法知道它的值,不可以用作数组下标。

2.在C++中

  在C++中,const就有很大不一样,C++中鼓励使用const来替代#define,在C++中对const定义的变量分为两种情况:

情况1(在.rodata段分配空间):

  如果const用在全局或者使用了static关键字说明,例如extern const int i=10,static const int i=10。那么这个i就是一个常量(网上有人说真正意义上的常量),并且该常量是存放在.rodata段的,是无法通过取地址方式去修改的(具体情况见情况2),修改会报段错误。

情况2(不在.rodata段分配空间):

  如果const用在局部并且没有使用static关键字,例如在main函数里面const int i=10*2+1,在这种情况下,如果对该常量:1)赋值是常量表达式(没有其它变量或者需要外界输入的值);2)不对该常量进行一些取地址类似的操作(&),就不会对i分配空间,仅仅是将其放在符号表中;否则,就会对i分配空间,而且这个空间是在栈上的,不同于全局的是分配在.rodata段上的。另外,注意,利用编译器反汇编的时候,可能会有一些假象,例如,在DEBUG模式下面的反汇编,编译器生成汇编代码为了能更好的调试,所以无论如何都会分配空间给const常量,但是如果你打开编译器的O2优化选项的话,就不会分配空间了。

  不过,不论分不分配空间,只要该常量的赋值是常量表达式(没有其它变量或者需要外界输入的值),编译器都会做一个优化,叫做常量折叠(const folding),简单来说,就是编译的时候,任何用到i的地方,都会直接用21去替换i。

a.有常量折叠

  如果i的赋值是常量表达式(没有其它变量或者需要外界输入的值),即i的值不需要访问存储空间来确定,那么程序中任何出现i的地方就已经在编译期间被替换,即使通过取地址来修改这个值,也是相当于改变了一个副本而已,如下:


const int i=1;

int *p=(int *)&i;

*p=2;

cout<<*p<<endl<<i<<endl;

输出结果:

2

1

  这说明,i的值是确定的情况下,程序中任何出现i的地方都被1替换了。

b.无常量折叠

  另一种情况,如果赋值不是常量表达式,这时是需要访问存储区域才能得到确切值的,这种情况并不会有"常量折叠",如下:


int i=10;

const char gc = cin.get();   //或者const char gc = i都是一样的

char *t = (char *)&gc;

*t += 2;

cout << *t <<endl << gc << endl;

输如:a

输出:

c

c

  从上面这个情况可以看出,虽然gc是局部的const,但是它的值是不确定的,是需要用户输入的,因此会为gc在栈中分配空间,并且因为gc的值不确定,它不能得到常量折叠带来的优化。程序中使用gc的地方,必须直接到存储区域去访问才能得到值,所以*t和gc的值是保持一致的。

  无常量折叠的情况下,一定是分配了内存空间的,因为无常量折叠的本质就是值不确定,需要到内存中获取。而有常量折叠的情况下,内存空间可能分配了,也可能没分配,如果分配了,那是因为对该常量进行了取地址相关的操作。

volatile关键字:

  除此之外,volatile关键字也能够屏蔽掉常量折叠,如下:


volatile const int i=1;

int *p=(int *)&i;

*p=2;

cout<<*p<<endl<<i<<endl;

输出结果:

2

2

  上面是我查阅资料综合得到的情况,具体来说,const使用情况可分为全局和局部(static关键字是一个因素),局部下又可分为分配内存与不分配内存、有常量折叠和无常量折叠,分不分配内存取决于是否要对该常量进行地址相关的操作(如&或者直接从内存取值),有没有常量折叠取决于需不需要直接从内存中取值。

  有很多不足还请各位大神指出,大家相互学习相互进步,勿喷就好,谢谢啦

转载请说明出处

C++中Const说明,布布扣,bubuko.com

时间: 2024-11-08 18:18:51

C++中Const说明的相关文章

C++中const使用注意要点(一)

最近看<C++编程思想>发现自己的基础确实不牢固,也想起了以前写代码时也因为const的事情浪费过时间,这里总结下几个要点. 首先说下内部链接和外部链接. 当一个cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有必要信息的单个源文件,这个源文件就是一个编译单元.编译器对每个编译单元(.cpp文件)进行编译生成相应.obj文件.PS:.c文件对应.o文件 接下来关键一步:链接器将所有不相关的.obj文件进行链接,生成最终可执行文件(.exe文件) // a.cpp: #includ

c++ 中const的使用

在c++中,const是这么一个东西:如果你希望能够有一些东西是别人不能修改的,这个时候const就起作用了. const 在使用情况如下: a.修饰常量 const int a; int const a; 这里不论const放什么位置,效果其实都一样的. b.修饰指针: const double *p--const放于指针*之前,代表当前指针指向的内存是不可改变的. double *const p--const放于指针*之后,代表当前指针是不可改变的. const double *const

C++中const限定符的应用

const限定符用于限定变量或对象的值.const对象一旦创建其值不能再改变.在C++中,const与引用和指针相结合,有多种用法.下面将结合<C++ Primer>第五版的内容做一个较详细的介绍. 1.const对象初始化 const对象必须初始化,初始化可以是任意复杂的表达式,如: const int i=get_size(); const int j=42; 2.文件间共享const对象 当以编译时初始化的方式定义一个const对象时,编译器将在编译过程中把用到该变量的地方都替换成对应的

c++中const关键字全面总结

一.const作用 1.const定义常量 注意:const只对它左边的东西起作用,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用. (1)const修饰变量,以下两种定义形式在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的. TYPE const ValueName = value; const TYPE ValueName = value; (2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初

C++ 中 const 和 static 的作用

目录 const 的主要应用如下: const 关键字使用的注意点: C++中static关键字有三个明显的作用: const的主要应用如下: const 用于定义常量:const定义的常量编译器可以对其进行数据静态类型的安全检查. const 修饰函数形式参数:当输入参数为用户自定义类型和抽象数据类型的时候,将"值传递"改为"const 引用传递" 可以提高效率. const 修饰函数的返回值:如果给"指针传递"的函数返回值加const,则返回

C++中const用法总结

1. const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的.它的含义是:const修饰的类型为TYPE的变量value是不可变的.对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value只不可变.例如:const int nValue:         //nValue是constint const nValue:    // nValue是const但是对于指针类型的TYPE,

C++中const简介

C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助. Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的. const关键字的作用主要有以下几点: (1)可以定义const常量,具有不可变性. 例如: const int Max=100; int Array[Max]; (2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐

结合示例说明C++中const和指针结合时怎么理解

在之前随笔<C++中const使用要点(一)>中简单叙述了const int*.int* const和const int* const的区别,记住三句话就能在实际运用时用对,但是看书时发现了指针常量.常量指针这些名词,发现明白这些概念对阅读文章时还是比较重要的. 关键:const和指针结合时代码从右往左看 1.常量指针(const pointer) 概念:常量是形容词,也就是说常量指针是一个指针,用const修饰的指针. 按照代码从右往左(概念名词从左往右)的阅读顺序,不妨试着写一下. Ste

C/C++中const的用法

const是C语言的关键字,经C++进行扩充,变得功能强大,用法复杂.const用于定义一个常变量(只读变量),当const与指针,引用,函数等结合起来使用时,情况会变得复杂的多.下面将从五个方面总结const的用法. 1.const位置 const位置较为灵活,一般来说,除了修饰一个类的成员函数外,const不会出现先一条语句的最后.示例如下: #include <iostream> using namespace std; int main(int argc,char* argv[]) {

C++中const char * const name;char * const name;cons

C++中const char * const name;char * const name;const char * name三者之间的区别? 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:HG Zhao链接:http://www.zhihu.com/question/26908463/answer/34499495来源:知乎 const *说明指向的是常量.* const说明指针是常量.const * const说明指针和指向的都是常量.