const常量折叠】的更多相关文章

首先来看一个例子: int main(int argc, char* argv[]) { ; int *j = (int *) &i; *j=; cout<<&i<<endlcout<<j<<endl; cout<<i<<endl; cout<<*j<<endl; ; } 结果是 0012ff7c0012ff7c 0 1 因为 i 和 j 都指向相同的内存地址,所以输出的前两个结果是相同的,但为…
http://bbs.byr.cn/#!article/CPP/86336?p=1 下列代码给出输出结果: #include"stdafx.h" #include <iostream> #include "stdlib.h" using namespace std; int main(void) { ; int * p = (int *)(&a); *p = ; cout << "a = " << a…
一.文章来由 const具体解释之二 二.const 取代 #define const最初动机就是取代 #define. const 优于 #define: (1) #define没有类型检查,const在编译期(而不是预编译期)做类型检查. (2)const方便调试和定位bug. 所以应该全然用const取代#define 三.头文件里的const (1)要使用const取代#define.相同须要把const定义放进头文件(或其它格式文件,include就可以). 这样通过包括头文件.可把c…
const int a=10: 涉及到一个叫常量折叠的概念(认为我这说得太简单或者不好理解的可以google一下它获取更多信息), 即编译器虽然会给a分配空间(如果取a的地址进行操作的时候,会强迫编译器进行内存分配), 但是在预编译阶段, 会把所有的a用10替换(这就有点像#define了), 所以虽然&a地址存放的内容改变了, 但是a依然为10. 10是字面常量 编译器实现的时候,可以优化,对int类型的字面常量,直接用立即数代替,这样10就不分配内存空间,但是对于“hello”这样的字符常量…
先看例子: #include <iostream> using namespace std; int main() { ; int * p = (int *)(&a); *p = ; cout<<"a = "<<a<<", *p = "<<*p<<endl; ; } 输出:a = 10, *p = 20 明明p指向的就是变量a所在的内存,可输出为什么不一样呢?这是常量折叠在作遂. 这个&…
前面的C++的常量折叠(一)的最后留下了一个问题,那就是在声明i的时候,加上修饰符volatile关键字,发现结果输出的就不一样了,下面来说一下volatile这个关键字. C/C++中的volatile关键字和const对应,用来修饰变量,通常用于建立语言级别的memory barrier.下面这句话是Stroustrup在“The C++ Programming Language”中对volatile修饰词的说明: A volatile specifier is a hint to a co…
前言 前几天女票问了我一个阿里的面试题,是有关C++语言的const常量的,其实她一提出来我就知道考察的点了:肯定是const常量的内存不是分配在read-only的存储区的,const常量的内存分配区是很普通的栈或者全局区域.也就是说const常量只是编译器在编译的时候做检查,根本不存在什么read-only的区域. 所以说C++的const常量和常量字符串是不同的,常量字符串是存储在read-only的区域的,他们的具体的存储区域是不同的. 就好像杨立翔老师在上课举得那个例子(讲的东西忘得差…
C++类静态成员变量和const常量在定义类的时候就必须初始化,否则都会编译出错. 而具初始化方法为: C++类静态成员变量初始化方法 #include <iostream> #include <string> #include <cstdio> #include <cstring> using namespace std; class A{ public: static void fun() { ab = 2; cout << ab <&…
背景知识 在开始之前先说一下符号表,这个编译器中的东西.下面看一下百度百科中的描述: 符号表是一种用于语言翻译器中的数据结构.在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型.作用域以及内存地址.符号表在编译程序工作的过程中不断收集.记录和使用源程序中一些语法符号的类型和特征等相关信息.这些信息一般以表格形式存储于系统中.如常数表.变量名表.数组名表.过程名表.标号表等等,统称为符号表.对于符号表组织.构造和管理方法的好坏会直接影响编译系统的运行效率. 还有一…
1.定义:const常量类型表示一个”常值变量“,其值是不能被修改的变量.即一旦变量被声明为const类型,编译器将禁止任何试图修改该变量的操作. 2.声明:const <声明数据类型> 常量或常量表达式初始化. 3.与宏定义指令#define的区别: #define只是做简单的文本替换,不会做类型检查. const声明时,编译器替换变量时会做严格的类型检查,只有与声明数据类型相同时才做替换. 4.常见的用途: 使用const限定函数的参数和返回值. 1)当函数的参数限定为const类型时,说…