| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 771 人关注过本帖
标题:关于volatile的小困惑,
只看楼主 加入收藏
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
9楼的兄弟,我没看懂啊

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-12-29 22:55
zhanzhan1991
Rank: 2
来 自:成都
等 级:论坛游民
帖 子:4
专家分:16
注 册:2012-12-28
收藏
得分:7 
const volatile int i = 10:   
const表示变量i只有读权限,没有写权限,就是不能更改,但是不代表变量i的值一直不变。
volatile表示变量i里面的值可能会被意想不到的改变。
当创建一个进程时,会分配4G的虚拟内存,其中包括:代码段、全局区、堆区、栈区;只有代码段是不可改的,强改会发生内存错误。而全局区、堆区、栈区都是可以改得。
比如const volatile int i = 10;如果在函数里定义,则会把i的内存分配到栈区;如果在函数外定义,则会分配到全局区;我们可以找到i的内存,然后改它的值。
比如:int *p = (int*)&i; *p = 100;  则i的值会变成100.  (顺便说下,如char *p = "aaaa";其中"aaaa"会保存在代码段中,p中存的是第一个a的地址,当我们通过p去改变其值时,如:p[1] = 'b';就会发生内存错误)
但是,如果没有加volatile修饰,在我们编译时,编译器会认为const int i;是常数,因此不会被更改,为了提高访问效率,就可能会把i的值保存起来,而不会到i的地址上去取数据。而加了volatile,编译器则不会做这个优化,每次需要i的值时,都会到i的地址上去取数据。

在处理底层数据时(比如驱动方面),会用到很多...
2012-12-29 22:56
善ing
Rank: 2
来 自:华东师范
等 级:论坛游民
帖 子:34
专家分:19
注 册:2012-11-18
收藏
得分:0 
谢谢12楼细致的讲解,我有点懂了

邂逅c  (⊙o⊙)
2012-12-29 23:43
快速回复:关于volatile的小困惑,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012333 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved