C++的常量折叠(二)

前面的C++的常量折叠(一)的最后留下了一个问题,那就是在声明i的时候,加上修饰符volatile关键字,发现输出的就不一样了,下面来说一下volatile这个关键字。

C/C++中的volatile关键字和const对应,用来修饰变量,通常用于建立语言级别的memory barrier。下面这句话是Stroustrup在“The C++ Programming Language”中对volatile修饰词的说明:

A volatile specifier is a hint to a compiler that an object may change its value in ways not specified by the language so that aggressive optimizations must be avoided.

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:volatile int vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。例如:

时间: 2024-10-12 05:25:16

C++的常量折叠(二)的相关文章

C++高级进阶 第四季:const具体解释(二) 常量折叠

一.文章来由 const具体解释之二 二.const 取代 #define const最初动机就是取代 #define. const 优于 #define: (1) #define没有类型检查,const在编译期(而不是预编译期)做类型检查. (2)const方便调试和定位bug. 所以应该全然用const取代#define 三.头文件里的const (1)要使用const取代#define.相同须要把const定义放进头文件(或其它格式文件,include就可以). 这样通过包括头文件.可把c

学习总结:拷贝构造函数、常量折叠、堆\栈

一.关于拷贝构造函数 1.相同类型的类对象是通过拷贝构造函数来完成整个复制过程的: 2.拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量: 3.三种情况下会调用拷贝构造函数:对象以值传递的方式传入函数参数.对象以值传递的方式从函数返回.对象需要通过另外一个对象进行初始化: 相关博文: http://blog.csdn.net/lwbeyond/article/details/6202256 二.常量折叠 1.编译器进行语法分析的时候,将常量表达

const常量,常量折叠,字面常量

const int a=10: 涉及到一个叫常量折叠的概念(认为我这说得太简单或者不好理解的可以google一下它获取更多信息), 即编译器虽然会给a分配空间(如果取a的地址进行操作的时候,会强迫编译器进行内存分配), 但是在预编译阶段, 会把所有的a用10替换(这就有点像#define了), 所以虽然&a地址存放的内容改变了, 但是a依然为10. 10是字面常量 编译器实现的时候,可以优化,对int类型的字面常量,直接用立即数代替,这样10就不分配内存空间,但是对于“hello”这样的字符常量

C++的常量折叠(一)

前言 前几天女票问了我一个阿里的面试题,是有关C++语言的const常量的,其实她一提出来我就知道考察的点了:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配区是很普通的栈或者全局区域.也就是说const常量只是编译器在编译的时候做检查,根本不存在什么read-only的区域. 所以说C++的const常量和常量字符串是不同的,常量字符串是存储在read-only的区域的,他们的具体的存储区域是不同的. 就好像杨立翔老师在上课举得那个例子(讲的东西忘得差

常量折叠(转载)

本文转载自http://blog.csdn.net/yby4769250/article/details/7359278 今天回顾了大学这几年学习C++的点点滴滴,在回顾了“常量折叠”这里时,突然困惑了,当时学习这点知识时的理解是:可折叠的常量像宏一样,在预编译阶段对常量的引用一律被替换为常量所对应的值,就和普通的宏替换没什么区别,并且,编译器不会为该常量分配空间.现在回顾起来,当时是多么的天真,被现象迷惑了,常量折叠确实会像宏一样把对常量的引用替换为常量对应的值,但是,并非不给该常量分配空间,

C++的常量折叠--const和volatile

背景知识 在开始之前先说一下符号表,这个编译器中的东西.下面看一下百度百科中的描述: 符号表是一种用于语言翻译器中的数据结构.在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型.作用域以及内存地址.符号表在编译程序工作的过程中不断收集.记录和使用源程序中一些语法符号的类型和特征等相关信息.这些信息一般以表格形式存储于系统中.如常数表.变量名表.数组名表.过程名表.标号表等等,统称为符号表.对于符号表组织.构造和管理方法的好坏会直接影响编译系统的运行效率. 还有一

常量指针与指针常量的区别(转帖)

三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开. 一) 常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量修饰它,表示这个指针乃是一个指向常量的指针(变量). 指针指向的对象是常量,那么这个对象不能被更改. 在C/C++中,常量指针是这样声明的: 1)const int *p; 2)int const *p; 常量指针的使用要注意,指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改,也

二维数组名作为实参或者形参

    1.方式1.void fun(int a[4][6]); //二维数据作为函数参数时,要明确指明二维数组的列数.         void fun(int a[][6])    //二维数组行数可以省略         另外,不能用非常量定义二维数组作为其下标.     */ void fun1(int a[][3],int n){//数组的行数    for (int i = 0; i < n; i++) {        for (int j = 0; j < 3; j++) { 

Java虚拟机原理图解-- 1.2、class文件中的常量池

了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路.但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的.感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成<Java虚拟机原理图解> 这个系列,以图解的形式,将抽象的JVM虚拟机的知识具体化,希望能够对想了解Java虚拟机原理的的Java程序员 提供点帮助. 上一章节&l