常量折叠概念

  常量折叠表面上的效果和宏替换是一样的,只是“效果上是一样的”,而两者真正的区别在于,宏是字符常量,在预编译宏替换完成后,该宏名字会消失,所有对宏的引用已经全部被替换为它所对应的值,编译器当然没有必要维护这个符号,而常量折叠发生的情况是,对常量的引用情况全部替换为该常量的值,但是,常量名并不会消失,编译器会把它放入到符号表中,同时会为该变量分配空间,栈空间或全局空间。

void const_test()
{
int i0 = ; const int i=; //定义常量i
int *j = (int *) &i; //看到这里能对i进行取值,判断i必然后自己的内存空间
*j=; //对j指向的内存进行修改
printf("%d\n%d\n%d\n%d\n",&i,j,i,*j); //观看实验效果
const int ck = ; //这个对照实验是为了观察,对常量ck的引用时,会产生的效果
int ik = ck; int i1 = ; //这个对照实验是为了区别,对常量和变量的引用有什么区别
int i2 = i1;
}

输出结果:

  0012ff7c

  0012ff7c

  0

  1

(1)ij地址相同,*j==1,而i的值却实实在在等于0
(2)printf("%d\n%d\n%d\n%d\n",&i,j,i,*j) 别替换为printf("%d\n%d\n%d\n%d\n",&i,j,0,*j) 
(3)对可折叠的常量的引用会被替换为该常量的值,而对变量的引用就需要访问变量的内存

const在集合中的错误使用

  const可以用于集合,但编译器不能把一个集合存放在它的符号表里,所以必须分配内存。在这种情况下,const意味着“不能改变的一块内存”。然而其值在编译时不能被使用,因为编译器在编译时不需要知道存储的内容。

  const int i[] = {1,2,3,4,5};
   int a = i[3];
   float f[i[3]];  // illegal

  在一个数组定义里,编译器必须能产生这样的移动存储数组的栈指针代码,在上面的非法定义里,编译器给出的提示是因为它不能再数组定义里找到一个常量表达式。

const在C和C++中的区别

const int buffsize = ;
char buff[buffsize];

  上面的代码在C++中可以,但在C中不行,因为buffsize占用存储的某个地方,所以C编译器不指定它在编译时的值

const int buffsize;

  上面的代码在C中可以,因为在C中默认const为外部链接,C++默认const为内部链接,所以再C++中要写成extern const int buffsize;

类里const和enum

  在一个类里,const恢复它在C中的一部分意思,它在每个类对象里分配存储并代表一个值,这个值一旦被初始化以后就不能改变。在一个类里使用const的意思是“在这个对象寿命周期内,这是一个常量”。然而,对这个常量来讲,每个不同的对象可以含一个不同的值。所以不能像下面这么写:

class bob
{
const int nSize = ;
int array[nSize];
};

  因为在类对象进行了存储空间分配,编译器不知道const的内容是什么,所以不能把它用作编译期间的常量。

  我们可以使用不带实例的无标记的enum

class bob
{
enum {nSize = }; int array[nSize];
};

使用enum是不会占用对象中的存储空间的,枚举常量在编译时被全部求值。枚举在类外面时,占用4个字节空间

  这样,在一个类里建立一个const时,不能给它初值。这个初始化工作必须发生在构造函数里,并且要在构造函数的某个特殊的地方。因为const必须在建立它的地方被初始化,所有在构造函数的主体里,const必须已经被初始化,否则就只有等待,直到在构造函数主体以后给它初始化,这样无法防止在构造函数主体的不同地方改变const的值。

class fred
{
private:
const int nSize;
public:
fred();
}; fred::fred():nSize(){}

C++常量const的更多相关文章

  1. 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const

    C#中有两种类型的常量:编译期常量和运行时常量.二者有着截然不同的行为,使用不当将会带来性能上或正确性上的问题. 这两个问题最好都不要发生,不过若难以同时避免的话,那么一个略微慢一些但能保证正确的程序 ...

  2. 宏(define)与常量(const)

    http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=402470669&idx=1&sn=e34db91190d8d46f ...

  3. 常量Const

    常量Const YEAR = 2019 # 全部大写的变量名为常量 注释 给不能理解的写一个描述 便于理解 增强可读性 三种形式 单行(当行)注释:# 只注释一行 不能换行 注释的代码不执行 不使用 ...

  4. 石川es6课程---3、变量let和常量const

    石川es6课程---3.变量let和常量const 一.总结 一句话总结: let非常好用,尤其是let的块级作用域可以解决之前要(function(){})()立刻执行函数做的块级作用域 1.js中 ...

  5. #define 和常量 const 的区别

    const 后的常量,程序对其中只能读不能修改. #include <iostream> using namespace std; int main() { const double pi ...

  6. iOS 宏(define)与常量(const)的正确使用

    在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰 你能区分下面的吗?知道什么时候用吗? #define HSCoder @ ...

  7. OC中修饰符:宏define 常量:const extern

    const const最好理解,修饰的东西不能被修改 指针类型根据位置的不同可以理解成3种情况: I 常量指针 // 初始化之后不能赋值,指向的对象可以是任意对象,对象可变. NSString * c ...

  8. c#基础--常量(const),只读字段(readonly)

    1.0:常量 常量被关键字const 所修饰 我们来看看常量的demo class Program { static void Main(string[] args) { const string n ...

  9. in C#,编译型常量(const)和运行时常量(readonly)

    readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数, readonly ...

  10. 【转】iOS 宏(define)与常量(const)的正确使用-- 不错

    原文网址:http://www.jianshu.com/p/f83335e036b5 在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与c ...

随机推荐

  1. js原型 作用域

    了解JavaScript原型链之前首先肯定要知道什么是原型. JavaScript中,原型是一个对象,通过原型可以实现属性的继承.既然原型是一个对象,那么任何一个对象都可以称为原型吗?是,记住它.什么 ...

  2. netty2---服务端和客户端

    客户端: package com.client; import java.net.InetSocketAddress; import java.util.Scanner; import java.ut ...

  3. 【Flask】WTForms基本使用

    # WTForms笔记:这个库一般有两个作用.第一个就是做表单验证,把用户提交上来的数据进行验证是否合法.第二个就是做模版渲染. ### 做表单验证:1. 自定义一个表单类,继承自wtforms.Fo ...

  4. jQuery幻灯片播放器插件

    在线演示 本地下载

  5. get the request body of all quests before handle it

    https://stackoverflow.com/questions/23660340/need-to-log-asp-net-webapi-2-request-and-response-body- ...

  6. 转: 在hibernate中查询使用list,map定制返回类型

    在使用hibernate进行查询时,使用得最多的还是通过构建hql进行查询了.在查询的过程当中,除使用经常的查询对象方法之外,还会遇到查询一个属性,或一组聚集结果的情况.在这种情况下,我们通常就需要对 ...

  7. Jquery.LazyLoad.js实现图片延迟加载功能

    从网上下载来的版本多多少少都有些BUG,尤其是加载后在IE6和IE7下图片闪动是个大问题,在网上查了很久,也没有找到相关的解决方案.没解决方案,就得发挥咱DIY的精神,自己想法解决,分析了BUG,理了 ...

  8. fix LayerKit framework不能提交App Store

    - 问题: - 原因 x86_64, i386是ios模拟器用的architectures.发布时,不支持这两种.但是,默认编译出来的layerkit framework支持这两种编译器 - 解决办法 ...

  9. openlayers2地图控件扩展:要素删除DeleteFeature

    实现要素删除控件,扩展OpenLayers.Control类,实现效果:选择DeleteFeature工具后,选择要素,按delete键删除要素(这里的删除只是将feature设置成delete状态, ...

  10. Substring with Concatenation of All Words, 返回字符串中包含字符串数组所有字符串元素连接而成的字串的位置

    问题描述:给定一个字符数组words,和字符串s,返回字符数组中所有字符元素组成的子串在字符串中的位置,要求所有的字符串数组里的元素只在字符串s中存在一次. 算法分析:这道题和strStr很类似.只不 ...