C储存类,链接和内存管理学习总结和心得

来源:互联网 发布:淘宝购车靠谱吗 编辑:程序博客网 时间:2024/06/03 19:47

C5种储存类:自动,寄存器,具有外部链接的静态,具有内部链接的静态和具有空链接的静态。

储存类                         时期    作用域    链接       声明方式

自动                             自动    代码块     空        代码块内

寄存器                         自动    代码块     空        代码块内,使用关键字register

具有外部链接的静态    静态     文件     外部       所有函数之外

具有内部链接的静态    静态     文件     内部       所有函数之外,使用关键字static

空链接的静态               静态     文件       空        代码块内,使用关键字static

 

解释一些关键字:

aotu类型表示该变量的存在时间由函数调用决定,且定义变量时默认使用aotu类型

extern关键字声明表示该变量由外部声明定义,且在此处引用,若引用其他文件定义的变量则必须要使用extern关键字

static表示该变量是静态的,即与整个程序的生存周期相同,同时,static型的变量在编译程序之前进行编译,即除了#提示的预编译内容外,static内容编译的优先级最高,这样造成的特性就是在程序中被static提示的内容不会被重复定义声明,这在函数的递归中很重要。

register表示该变量被放置在寄存器或者较快的内存中,这样的变量可以对程序的运行速度造成一定的优化,然而由于寄存器的特殊性,被该关键字标注的变量无法获得其地址,所以不能对其使用指针(即使该变量被放在了内存中)。

const不做解释。。。。。。。

volatile告诉编译器这是一个易变的变量,即可能被除了用户运行的程序之外的代理所更改,这类变量由于可能会在一些未知的情况下被修改,所以如果对其进行运行优化会产生错误的计算结果,如硬件的时钟等。反过来,非volatile变量即代表该变量的所有调用和变化都被程序所监控,因此编译器可以对其进行适当的计算优化。

restricted只可被用于指针,并表明指针是放弃一个数据对象的唯一且初始的方式,从结果上来说,这样的限定可以使程序的运行更加安全,但可能会使程序的编写变得更加麻烦。

 

c中还有一个不太常用的作用域被称为函数作用域,这些标记与goto联用,作为跳转的标记,不过由于goto的危害性,这个作用域的存在感如同阿卡林一般............

 

写一些总结:

没有在代码块内定义而具有全局作用域的储存类或声明方式

c程序编译的顺序:预编译->main外部声明和static变量->main

extern更像是链接的关键字,而不是声明,准确的说extern其实是引用声明的关键字。

向函数传递数据的方法不仅可以使用传值调用,也可以用全局变量,尽管这种方式并不推荐

在多文件编译中,使用static关键字修饰变量,使变量在编译main前完成定义声明,这样就可以不用担心多文件中的重复声明了。

使用全局变量会造成不必要的风险,因为全局变量会被各个函数所修改,所以使用全局变量时最好使用const关键字修饰,使其变为常量。不过既然这么麻烦为什么不用define

 

Malloc()和free()是c进行内存管理的基础,也是c的高级数据结构的基础,如链表等。与malloc相似的还有calloc(),其实并没有什么太大的区别,除了自动进行了元素初始化。只是多了这么一个功能就要多写一个库函数.........不嫌麻烦么............

 

多样性的储存类使c优化一个程序的方法变得十分丰富,不过既然c现在只是用来写底层的东西,那有必要计较这一点运行速度吗.............

0 0
原创粉丝点击