linux c const 作用,linux c类型限定符const、volatile、inline

linux c类型限定符const、volatile、inline

首页 计算机相关 linux c基础 linux c类型限定符const、volatile、inline

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,这样编译器就不会对它进行优化,每次都会从内存里读,不会从高速缓存里读取xvolatile int x = 1;

inline 是用来声明内联函数的,内联函数可以减少频繁的入栈和出栈。#include

inline void test(){

printf("haha\n");

}

int main(){

int i = 0;

for(; i < 100; i++){

test();

}

}

上面的代码编译后,类似于#include

int main(){

int i = 0;

for(; i < 100; i++){

printf("haha\n");

}

}

inline 只适合函数体内代码简单的函数数使用,不能包含复杂的结构控制语句例如 while、switch,并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。

内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值