您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
039第七章 函数08(新版) 寄存器register与extern关键字
发布时间:2021-05-01 19:06:09编辑:雪饮阅读()
register
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。
接下来看看对于一个阶乘的算法实现
#include <stdio.h>
#include <time.h>
clock_t start, finish;
double times;
int main()
{
register int i,n=10,f=1;
start = clock();
for(i=1;i<=n;i++){
printf("\n %d \n",i);
f=f*i;
}
printf("\n outcome:%d \n",f);
finish = clock();
times = (double)(finish - start)/CLOCKS_PER_SEC;
printf("\n times:%f \n", times);
return 0;
}
/*
分析1:start,finish单位是ms;times单位是s;
分析2:算出来来的程序执行时间精度是ms级
*/
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
1
2
3
4
5
6
7
8
9
10
outcome:3628800
times:0.004000
接下来将register修饰去除:
#include <stdio.h>
#include <time.h>
clock_t start, finish;
double times;
int main()
{
int i,n=10,f=1;
start = clock();
for(i=1;i<=n;i++){
printf("\n %d \n",i);
f=f*i;
}
printf("\n outcome:%d \n",f);
finish = clock();
times = (double)(finish - start)/CLOCKS_PER_SEC;
printf("\n times:%f \n", times);
return 0;
}
再来试试
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
1
2
3
4
5
6
7
8
9
10
outcome:3628800
times:0.006000
可见register在这里比不用register快了0.002的速度。
是不是很妙啊
extern
我们知道,程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量则称为外部变量,外部变量也就是我们所讲的全局变量。它的存储方式为静态存储,其生存周期为整个程序的生存周期。全局变量可以为本文件中的其他函数所共用,它的有效范围为从定义变量的位置开始到本源文件结束。
然而,如果全局变量不在文件的开头定义,有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在引用之前用关键字 extern 对该变量作“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
来看一个简单的例子:
#include <stdio.h>
int max(int a,int b){
if(a>b){
return a;
}
else{
return b;
}
}
int main()
{
extern int A,B;
printf("max:%d",max(A,B));
}
int A=13,B=-8;
这里需要注意下,在一些老的教材中,比如小甲鱼的课程中内部extern定义A,B的时候是这样定义的
extern A,B;
它没有了这个类型的定义,可能他当时那个版本比较老,编译没有报错,但是在我这里是报错了的,错误大概如:
D:\cproject>gcc main.c -o m51
main.c: In function 'main':
main.c:13:9: warning: type defaults to 'int' in declaration of 'A' [-Wimplicit-int]
extern A,B;
^
main.c:13:11: warning: type defaults to 'int' in declaration of 'B' [-Wimplicit-int]
extern A,B;
^
main.c:14:6: error: declaration of 'A' with no linkage follows extern declaration
int A,B;
^
main.c:13:9: note: previous declaration of 'A' was here
extern A,B;
^
main.c:14:8: error: declaration of 'B' with no linkage follows extern declaration
int A,B;
^
main.c:13:11: note: previous declaration of 'B' was here
extern A,B;
^
那么我根据提示信息中的关键字“int”,于是尝试着在extern后面增加一个int类型,然后问题就解决了。
关键字词:寄存器,函数,register,extern