存储类&作用域&生命周期&链接属性

来源:互联网 发布:哪个品牌的网络电视好 编辑:程序博客网 时间:2024/06/05 04:37

《朱老师物联网大讲堂》学习笔记

学习地址:www.zhulaoshi.org


(1).
存储类,
变量存储在哪一种内存中,比如栈,堆,数据段,bss段,text段,


作用域,
变量起作用的范围,
代码块作用域,可以理解为{}之间的空间,


生命周期,


链接属性,
源代码编译成.o目标文件,里面有很多分段,数据段,代码段等...
变量名、函数名靠符号和对应内存链接在一起,


链接属性:外链接属性,内链接属性,无链接属性,


(2).
代码段,
对应程序中的代码,又叫.text,


只读数据段,
程序运行期间只能读不能写,


数据段,
显示初始化为非0的static局部变量,显示初始化为非0的全局变量,


bss段,
显示初始化为0或未显示初始化的全局变量,显示初始化为0或未初始化的static局部变量,


堆,使用取决于程序员,


文件映射区,
进程将文件从硬盘读取到文件映射区,以后在内存操作文件,


栈,局部变量呆的地方,


内核映射区,
操作系统的内核程序映射到这个区域,


(3).
auto修饰局部变量,auto的局部变量其实就是默认定义的普通的局部变量,


static,
修饰全局变量,形成静态全局变量,
修饰局部变量,形成静态局部变量,
1、静态局部变量在存储类方面和全局变量一样,
2、静态局部变量在生命周期方面和全局变量一样,
3、静态局部变量和全局变量的区别是:作用域、连接属性。静态局部变量作用域是代码块作用域(和普通局部变量是一样的)、链接属性是无连接;全局变量作用域是文件作用域(和函数是一样的)、链接属性方面是外连接,

register,




(4).
extern,
声明全局变量,在a.c中声明后才能使用b.c中的变量,


volatile,能否被编译器优化,
适合用在,isr中的变量,多线程中共用的变量,硬件会更改的变量,因为编译器无法预知这些变量的改变,


restrict,
用于修饰指针,强调该指针指向的变量,不能被除了该指针以外的指针修改,




(5).
作用域,
代码块作用域是{}括起来的部分,不仅仅是函数定义的那个{},if等也有{},


全局变量,函数作用域是所在文件范围,就是整个.c文件中,


同名变量的掩蔽规则,


(6).
生命周期,
栈,


堆,


全局变量的生命周期是永久的,与程序运行同在,


代码段的生命周期是永久的,


只读数据段,目前可以把它和代码段一样看待,


(7).
完整C程序包括多个c文件多个h文件,
程序编译后得到的是独立的.o文件,需要进行链接将独立的二进制函数组成一个整体的可执行程序,


不声明就无法单个文件进行编译,


函数和全局变量是外链接属性,


内链接,就是不能被外链接,不能被当前c文件外面的其它文件进行访问,


无链接,局部变量,静态局部变量都属于无链接,这些变量的符号本身不参与链接,


函数和全局变量的同名冲突,谁叫它们是外链接属性呢,那怎么办?
有些语言的解决方案是“命名空间namespace”,
c语言中的解决方法是,将明显不会在其它c文件中引用的全局变量和函数声明为static,这样它们的链接属性就变为内部链接了,
这种要么是,要么不是的方法,肯定有很大的局限性,对于大型的项目,除了可以确定为内链接的,还有很多外链接的,还是有重名问题,因为大型项目文件实在太多,


(8).
指针,全局变量,容易破坏全局性,java这种面向对象语言就不提供了,或者说是封装了,
那指针、全局变量与面向对象矛盾吗?
总结:

0 0
原创粉丝点击