您的位置:首页 > 编程语言 > C语言/C++

c语言符号定义、声明、引用、作用域及生命期、优化

2017-05-23 20:28 330 查看
1、变量

全局变量:不用考虑初始化问题,若未被初始化,则编译器自动设置为0;

局部变量:存储在内存的堆栈中,若未被初始化则使用其占用内存空间原有的值,这个值是个随机值,不初始化直接引用很危险。

2、定义及声明

    一个函数只能(也必须)在一个源文件里被定义,但是可以在其它多个源文件里被声明。定义引起存储分配,是真正产生那个实体。而声明并不引起存储分配。打一个粗俗的比方:在源文件A中定义,在源文件B中声明,好比在B里开了一扇窗,让它可以看到A里的那个函数。

    声明表示告诉编译器该变量的存在,但是不为该变量分配存储空间(int a;);而在定义变量时不仅告诉编译器该变量存在,而且为该变量赋值,由于赋值了,所以变量的存储空间就被分配了(int a=1;)。

    当变量的作用域范围内只有声明,没有定义时,编译器会自动将第1个声明当作是变量的定义。例如:

int f(int a)

{

int b;//找不到对变量b的定义,因此该处声明被认为是变量的定义;分配4个字节的存储空间给变量b

b=2;//这里是对变量b赋值,不是定义

return a+b;

}

C语言中的符号解析规则:

1)、不允许有多个符号(变量或函数)的定义;

2)、如果有一个符号的定义和多个符号的声明,则选择被定义的符号;

3)、如果有多个符号的声明,则从中任选一个作为符号的定义;

3、引用

    如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。
  如果不想包含头文件,那么需要在其他c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数就不用包含头文件。

4、作用域及生命期

全局变量:定义在函数外部,生命期整个程序;

局部变量:定义局部变量的函数或复合语句内,调用结束后生命期就结束;

static 全局变量:生命期不变(整个程序执行过程一直存在),作用域减小(只在本文件函数中可以引用);

static 局部变量:生命期增加(整个程序执行过程一直存在),作用域不变;

5、函数有关优化

1)访问内存在计算机的操作中很消耗时间,而每次调用函数都需要大量的时间来访问内存,因此在程序的执行过程中尽量减少函数调用,将运行结果相同的函数合并;

2)全局变量存储在数据段上也就是存储在内存中,局部变量存储在堆栈上。对于在程序中调用频率高的局部变量,编译器会自动将其存储在寄存器,但是全局变量不会存储在寄存器中,全局变量在整个程序执行过程中一直存在,那么在整个程序执行过程中,该寄存器都将无法存储临时变量或中间值,这对于寄存器资源稀少的计算机是不可接受的,程序运行效率会大打折扣。而访问内存的时间要远远大于cpu的计算时间,因此要较少内存访问,不要将使用频率高的变量设置为全局变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐