C与C++中的const

一样,有下面一段代码:ios

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     const int i = 0; 
 7     int *j = (int *) &i; 
 8     *j = 1; 
 9     cout<<"i address = 0x"<<hex<<&i<<","<<"j address = 0x"<<hex<<j<<endl;
10     cout<<"i value = "<<i<<","<<"j value = "<<*j<<endl;
11     system("pause");
12     return 0;
13 }

咱们在C++编译器中运行以下:c++

咱们发现const关键字严格遵照了其关于常量的定义。然而疑问出来了测试

为何相同的地址会输出不一样的值。优化

 

一样的代码咱们放入C编译器中运行会发现输出结果:spa

i value = 1,j value =1

这是为何呢?code

 

如下是我本身的一点理解:blog

1.C语言中const为不可改变的变量,其实质仍然是变量,仍然会在编译期间分配内存内存

   那么咱们能够获取该内存并修改该内存处的值。这样虽然不容许直接对const 变量修改编译器

   可是间接修改该内存位置的值达到修改该变量的效果。io

 

2.C++中const关键字定义的是常量类型,在编译的期间直接肯定了其值,好比咱们

   可进行以下操做在C++中 编译是能够经过的

1 const int size=5;
2 int array[size];

    代表在编译的时候size是已经肯定了。然而这种状况在C语言的状况下是绝对不能够编译经过的,

    其实我猜,当咱们在c++中定义一个const类型的变量的时候,编译器也是要为其分配内存的,

    只不过在编译阶段遇到时候直接替换,在运行的时候,该常量的值是直接存在某个寄存器中,这样

    运行代码中须要用到该值时直接可从寄存器中索取,而非在内存中索取。

 

那么,咱们能够做这样一种测试,咱们把const前面加上volatile关键字防止编译器直接从寄存器中取 

常量值,而是从内存中取,代码以下:

咱们发现此时,const类型变量i的值是已经被改变了,则证实我猜测的思路也许是对的,又或许编译器

用了更复杂的方式处理,可是大概思路应该是这样吧

 

最后咱们总结下:

前面说了那么多无非有如下两点:

1.C C++中的const变量是都要分配内存的。

2.C++只不过在编译的时候直接进行变量替换,同时在运行过程当中直接在寄存器中取const变量的

   值,这是C++编译器优化的结果。

3.而对于C语言而言每次const使用都是直接从内存中取值,这样每次const变量的间接改变都能获得

   反映。

 

若是你有更好的理解欢迎一块儿讨论或者分享。

相关文章
相关标签/搜索