`
touchinsert
  • 浏览: 1284324 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C++常量折叠

 
阅读更多

C++代码如下:

const int a=9;

int *p=(int*)&a;

*p=10;

printf("a: %d , *p %d",a,*p); //a: 9 ,*p: 10

为什么*p改变了,但是a没有改变呢?(g++)

google:常量折叠.
源于编译器的优化.因为是常量,会直接当作常数输出,不会检测你是否改变了他.

加上volatile:

volatile const int a = 9;//这样的话就会按你想的输出了

因为常量折叠,C++编译器会把这个常量 a 当作是9,a这个变量就相当于不存在了,但是它还是真的存在的。呵呵。

所以呢,其实*p改变了a的值,只要我们 volatile,让编译器不要优化我们的const 常量即可。优化后不会去真实地址查看其值是否改变,加了volatile就会每次去真实地址提取值

比如: const int a=9;cout<<a<<endl; 优化后: cout<<9<<endl; 则a相当于不存在了。哈哈

(有人说: 呵呵

最后给楼主一句忠告:不要(通过各种“诡异”的方法)修改常量的值,否则程序行为未定义。

真好,又学到了一点点知识。

分享到:
评论

相关推荐

    数据结构C++描述

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数...

    数据结构算法与应用(C++语言描述).rar

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2...

    数据结构与算法:C++描述

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2...

    C++语言描述(PDF合集)

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2...

    数据结构算法与应用-C++语言描述

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2...

    数据结构 C++描述

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2...

    数据结构算法与应用-C C++语言描述

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 ...

    数据结构、算法与应用--C++语言描述

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2...

    数据结构算法与应用-C++语言描述.rar

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类...

    数据结构算法与应用 很详细的,数据结构算法全集 这个是你想找的

    目 录 译者序 前言 第一部分 预备知识 第1章 C++程序设计 1 1.1 引言 1 1.2 函数与参数 2 1.2.1 传值参数 2 1.2.2 模板函数 3 1.2.3 引用参数 3 1.2.4 常量引用参数 4 1.2.5 ...

    Linux C程序设计大全

    2.6.2 表达式优化——常量折叠 2.6.3 表达式优化——使用数学公式 2.6.4 表达式优化——存储问题 2.6.5 分支优化——改变判断顺序 2.6.6 分支优化——使用switch语句 2.6.7 循环优化——一次性计算 第3章 C语言中的...

    ofxJpegCollapse:我们喜欢JPEG

    ofxJpeg折叠我们喜欢JPEG。注意现在我们只能加载Baseline JPEG原料药布尔负载(常量字符串&fpath,int结束,int开始) 布尔负载(const ofBuffer&buf,int结束,int开头)更新记录2015/09/08版本0.01发行执照MIT...

    数据结构算法与应用-C__语言描述

    1.2.4 常量引用参数 4 1.2.5 返回值 4 1.2.6 递归函数 5 1.3 动态存储分配 9 1.3.1 操作符new 9 1.3.2 一维数组 9 1.3.3 异常处理 10 1.3.4 操作符delete 10 1.3.5 二维数组 10 1.4 类 13 1.4.1 类Currency 13 1.4.2...

Global site tag (gtag.js) - Google Analytics