linux c类型限定符const volatile

原文地址http://daileinote.com/computer/c_base/06
const

const类型限定符是用来设定对象为只读。

const int num;
num = 2;    //报错
    
const int num = 2;  //没问题

//声明数组只读
const int days[4] = {1,2,3,4};

 

声明普通变量和数组使用const比较简单,指针则复杂一些,主要是要区分是限定指针本身还是限定指针指向的数据。

//p指向的值不可改变,p本身可改变
//等同于int const * p;
const int * p;

//p本身不可改变(也就是必须指向同一个地址)
//而p指向的内容可以改变
int * const p;

//同时限制
const int * const p;

同样可作用于函数

//代表在函数内不可改变第一个接收到的数组arr
void bee(const int arr[], int n);

 

文件间共享const全局数据

在a.c中定义,在b.c中读取

//a.c
const int n = 1;
//b.c
extern int n;

 

另一种方法在comm.h头文件中定义,然后a.c和b.c同时包含

//comm.c
static const int n = 1;
//a.c
#include "comm.c"
//b.c
#include "comm.c"

如果去掉了comm.c有些编译器就会报错,因为a.c和b.c重复声明了n,加上static就没有关系,因为关键字static会让n只在当前文件内可见。

 

volatile

这个关键字用来告诉计算机这个变量是易变的,主要是用来处理数据共享的。

我们知道寄存器里也有少量的内存(高速缓存),有时候聪明的编译器为了加快运行速度,把读取频繁的但又没有改变的变量会临时放在寄存器里,当然在不共享数据的程序里完全没有问题。

int x = 1;
int val1 = x;

//一些额外的代码,但是都没有改变x

int val2 = x;

经过优化的编译器在编译上面的代码时,发现x被读取了2次,但是在读取中间又没有改变x,于是它就会优化编译结果,执行代码时,第一次读取x后x就会存入高速缓存,第二次直接在高速缓存读取。假设在2次读取x的中间其他程序修改了x为3,那么第二次读取x(因为是从高速缓存里读出来的)就还是1。

所以在声明时加上volatile,这样编译器就不会对它进行优化,每次都会从内存里读,不会从高速缓存里读取x

volatile int x = 1;

原文地址http://daileinote.com/computer/c_base/06

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值