const和volatile的区别

一.关键字const有什么含意?程序员

       只要一听到说:“const意味着常数”,就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里彻底归纳了const的全部用法,所以ESP(译者:Embedded Systems Programming)的每一位读者应该很是熟悉const能作什么和不能作什么.若是你从没有读到那篇文章,只要能说出const意味着“只读”就能够了。尽管这个答案不是彻底的答案,但我接受它做为一个正确的答案。(若是你想知道更详细的答案,仔细读一下Saks的文章吧。)
若是应试者能正确回答这个问题,我将问他一个附加的问题:
下面的声明都是什么意思?

const int a;
int const a;
const int *a;
int * const a;
int const * const a ;优化

前两个的做用是同样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针能够)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是能够修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。若是应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即便不用关键字 const,也仍是能很容易写出功能正确的程序,那么我为何还要如此看重关键字const呢?我也以下的几下理由:
?; 关键字const的做用是为给读你代码的人传达很是有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。若是你曾花不少时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(固然,懂得用const的程序员不多会留下的垃圾让别人来清理的。)
?; 经过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
?; 合理地使用关键字const可使编译器很天然地保护那些不但愿被改变的参数,防止其被无心的代码修改。简而言之,这样能够减小bug的出现。spa

二,volatile 指针

volatile影响编译器编译的结果,指volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以避免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。编译器

例如: 
volatile int i=10; 
int j = i; 
... 
int k = i; 
编译

volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,于是编译器生成的可执行码会从新从i的地址读取数据放在k中。而优化作法是,因为编译器发现两次从i读数据的代码之间的代码没有对i进行过操做,它会自动把上次读的数据放在k中。而不是从新从i里面读。这样一来,若是i是一个寄存器变量或者表示一个端口数据就容易出错,因此说volatile能够保证对特殊地址的稳定访问,不会出错。 
变量

相关文章
相关标签/搜索