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

const int a=10;

涉及到一个叫常量折叠的概念(认为我这说得太简单或者不好理解的可以google一下它获取更多信息), 即编译器虽然会给a分配空间(如果取a的地址进行操作的时候,会强迫编译器进行内存分配), 但是在预编译阶段, 会把所有的a用10替换(这就有点像#define了), 所以虽然&a地址存放的内容改变了, 但是a依然为10.

10是字面常量

编译器实现的时候,可以优化,对int类型的字面常量,直接用立即数代替,这样10就不分配内存空间,但是对于“hello”这样的字符常量,则必须分配内存空间,通常在rodata段中

       rodata
rodata
的意义同样明显,ro代表read only,即只读数据(const)。关于rodata类型的数据,要注意以下几点:
        常量不一定就放在rodata里,有的立即数直接编码在指令里,存放在代码段(.text)中。
         对于字符串常量,编译器会自动去掉重复的字符串,保证一个字符串在一个可执行文件(EXE/SO)中只存在一份拷贝。
         rodata是在多个进程间是共享的,这可以提高空间利用率。
         在有的嵌入式系统中,rodata放在ROM(如norflash)里,运行时直接读取ROM内存,无需要加载到RAM内存中。
         在嵌入式linux系统中,通过一种叫作XIP(就地执行)的技术,也可以直接读取,而无需要加载到RAM内存中。

由此可见,把在运行过程中不会改变的数据设为rodata类型的,是有很多好处的:在多个进程间共享,可以大大提高空间利用率,甚至不占用RAM空间。同时由于rodata在只读的内存页面(page)中,是受保护的,任何试图对它的修改都会被及时发现,这可以帮助提高程序的稳定性。

http://www.360doc.com/content/12/0824/20/8093902_232153101.shtml

时间: 2024-08-24 16:04:42

const常量,常量折叠,字面常量的相关文章

max() 会认为其参数是不会被改变的,我们应该将 t1和t2声明为 const (常量)

在创建完成抽象操作的函数时,如:拷贝,反转和排序,你必须定义多个版本以便能处理每一种数据类型.以 max() 函数为例,它返回两个参数中的较大者: double max(double first, double second); complex max(complex first, complex second); date max(date first, date second); //..该函数的其它版本 尽管这个函数针对不同的数据类型其实现都是一样的,但程序员必须为每一种数据类型定义一个单

const限定常量或者变量(初次赋值后),其值不允许被改变

CONST(C中的CONST) const是一个C语言(ANSI C)的关键字,它限定一个变量不允许被改变,产生静态作用.使用const在一定程度上可以提高程序的安全性和可靠性.另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助.另外CONST在其他编程语言中也有出现,如A++.PHP5.B#.net.HC08 C.C#. 中文名 C语言的关键字 外文名 const 所属领域 计算机 格    式 C++.PHP5 目录 1 定义 2 目的 3 主要作用 4 

JS 使用const声明常量的本质

在我们使用const声明常量时,总认为值一旦声明就不可改变,其实是有误解的: 刚在看ES6标准文档时,仔细阅读了const的解析,恍然大悟的感觉,分享给大家. 本质 const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动.对于简单类型的数据(数值.字符串.布尔值),值就保存在变量指向的那个内存地址,因此等同于常量. 但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就

为什么很多人使用#define而不是const定义常量

众所周知,C语言一开始只有#define,C程序员用#define定义符号常量.但后来ANSI C加入了const限定符,而const应该比#define更好,为什么现在的C程序员还在大量使用#define来定义常量呢? 这并不是我没有根据地乱说的.这样的例子有很多,例如<limits.h>,例如Windows API,例如OpenGL-- <limits.h>是C标准头文件,发明C语言的人为什么不知道const吗? Windows是Microsoft开发的,难道Microsoft

php中const定义常量

const 常量 1.在定义时必须被初始值,2.前面不加任何修饰符3.变量名字母一般都大写4.常量可以被子类继承5.一个常量是属于一个类的,而不是某个对象的 作用:当某些值是固定不变的,就用const 1.const 定义的常量和define()定义的常量的区别? 希望一个成员变量不被修改 例如圆周率 3.1415926定义:const 常量名=值; 没有$符访问:类名 ::常量名 或 接口名::常量名 <?php defined('TEXT');检查一个名称的常量是否存在 class A{ c

#define与const定义常量的区别

首先,#define 宏定义,使用方法如下: 1 #define PI 3.14159 2 3 #define MAX(a,b) a>=b?a:b const使用方法 const [常量类型] 符号常量名=表达式;,如果在定义时缺省“常量类型”,则默认为int类型.如下: 1 const double PI = 3.14159; 2 const TEST = 2; 下边通过例子来说明两者之间的区别: 首先#define, T2的值病不是想象中的0而是10,因为宏展开时知识简单的替换,T2被展开为

iOS define 宏定义 和 const定义常量区别

const   const 是c++中的修饰符.  c++中常用来定义常量,修饰左值. #define 宏定义语句, 在预处理阶段直接做文本替换,不做类型检查. 它们之间的最大区别: 1.  对于const 变量,系统只给了一个相应的内存地址,而#define则是给出了一个立即数.因为const变量是存放在内存的静态区域中,所以在程序运行过程中const变量只有一个拷贝,而#define 所定义的宏变量却有多个拷贝,所以宏在程序运行过程中所消耗的内存要比const变量的大得多.#define所定

ES6学习之const声明常量的学习

在ES中const关键字用来声明常量,与C#中的类似 const声明的一经定义不能修改 和let特性差不多, const a = 13; console.log(a); a = 5; //报错 const定义完常量后必须赋值,后面不允许再次赋值 const aa; const b; //报错 const定义完后,必须赋值,后面不允许赋值 b=5; alert(b): const c = 12; (function () { console.log(c); //死区 访问不到 const c =

【转】C++ 常量类型 const 详解

文章转自:http://www.cnblogs.com/daocaoren/archive/2011/07/14/2106278.html 1.什么是const? 常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:) 2.为什么引入const? const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点. 3.cons有什么主要的作用?(1)可以定义const常量,具有不可变性. 例如: const in

const常量和#define宏常量的区别

http://blog.csdn.net/lifengguo_njupt/article/details/7992332 C++可以用const定义常量,也可以使用#define来定义常量,但是前者比后者有更多的优点: 1,const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行静态类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能产生意想不到的错误(边际效应) 2,有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试. 所以在C++中