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

c语言 常见问题

2018-03-12 20:03 218 查看
一.static 关键字的作用1.隐藏,当我们同时编译多个文件时,所有未加 static 前缀的全局变量和函数都具有全局可见性.
2.static 的第二个作用是保持变量内容的持久.存储在静态数据区的便令会在程序刚开始运行时完成初始化,也是唯一的一次初始化.共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量笔记起来,static 可以控制变量的可见范围.
3.static 的第三个作用默认初始化为0.全局变量也具备这一属性,因为全局变量也存储的静态数据区.在静态数据区,内存的所有字节默认都是0*00,某些时候这一特点可以减少程序员的工作量.二.线程与进程的区别和联系1.进程的概念进程是表示资源分配的基本单位,又是调度运行的基本单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格,内存空间,磁盘空间,I/O设备等.然后把该进程放入进程的就绪队列.进程调度程序选中它,为它分配 CPU以及其他相关资源,该进程才真正运行.所以进程是系统中的并发执行的单位.
在 Mac,Windows NT 等采用微内核结构的操作系统,进程功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位.在微内核系统中,真正调度运行的基本单位是线程.因此实现并发功能的单位是线程.2.线程的概念线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位.如果把进城理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一.例如,假设用户启动了一个窗口中的数据库应用程序,操作系统就将对数据库的调用表示为一个进程,假设用户要从数据库查询请求,这又是一个子任务.这样,操作系统则摆每一个请求–工资单报表和新输入的数据次查询表
4000
示数据库进程中的独立的线程.线程可以在处理骑上独立调度执行,这样,在多处理器环境下就语序几个线程各自在单独处理上执行.操作系统提供线程就是为了方便而有效地实现这种并发性.
1.易于调度
2.提高并发性.通过线程可方便有效地实现并发性.进程可创建多个线程执行同一程序的不同部分.
3.开销少.创建线程比创建进程快.
4.利于充分发挥多处理器的功能,通过创建多线程进程(一个进程可以有两个或多个线程,每个线程在一个处理器上运行,从各实现应用程序的并发性,使每个处理器都得到充分运行)3.线程和进程的关系1.一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程.线程是操作系统可识别的最小执行和调度单位.
2.资源分配个进程,同一进程的所有线程共享该进程的所有资源.同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储).但是每个线程拥有自己的栈段,栈段又佳作运行时段,用来存放所有局部变量和临时变量.
3.处理机分给线程,即真正在处理机上运行的是线程.
4.线程在执行过程中,需要协作同步.不同进程的线程间要利用消息通信的办法实现同步.4.线程与进程的比较线程具有许多传统进程所具备的特征,故而又称为轻型进程,或进程元;而把传统的进程称为重型进程,它相当于只有一个线程的任务.在引入了线程的操作系统中,通常一个进程都有若干个线程,至少需要一个线程.
1.调度
在传统的操作系统中,拥有资源的基本单位和独立调度,分品牌的基本单位都是进程.而在引入线程的操作系统中,则把线程作为调度和分派的基本单位.而摆进程作为资源拥有的基本单位,使传统进程的两个属性分开,线程便能轻装运行,从而可显著的提高系统的并发性.在同一进程中,线程的且换不回引起进程的切换,在有一个进程中的线程切换到另一个线程时,将会引起线程的切换.
2.并发性
在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间,也可并发执行,因而使操作系统具备更好的并发性,从而能有效地使用系统资源和提高系统吞吐量.例如,在一个未引入线程的单 CPU操作系统中,若仅仅设置一个文件服务进程,当它由于某种原因被阻塞时,便没有其他的文件服务进程来提供服务.在引入线程的操作系统中,可以在一个文件服务进程中,设置多个服务线程,当第一个线程等待时,文件服务进程中的第二个线程可以继续运行,当第二个线程阻塞时,第三个线程可以继续执行,从而显著的提高了文件服务的质量和系统的吞吐量.
3.拥有资源
不论是传统的操作系统还是有线程的操作系统,进程都是拥有资源的一个独立单位他可以拥有自己的资源.一般来说,线程自己不拥有系统资源(也有一点必不可少的资源),但它可以访问其隶属的进程的资源.也就是,一个进程的代码段,数据段以及系统资源,如一打开的文件,I/O设备等,可供同一进程的其他所有线程共享.
4.系统开销
由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间 I/O设备(管理和控制计算机的所有输入/输出(I/O)设备是操作系统的主要功能之一,主要分为字符设备和块设备。一般由机械和电子两个部分组成。
)等.因此系统操作所付出的开销将显著的大于在创建或撤销线程时的开销.类似的,在进行进程切换时,设计到整个当前进程 CPU环境的保存以及新被调度运行的进程的 CPU环境的设置.而线程切换只需保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作.由此可见,进程切换的开销远大于线程切换的开销.此外,由于同一进程中的多个线程具有相同的地址空间,致使他们之间的同步和通信的实现,也变得比较容易.在有的系统中,线程的切换, 同步和通信都无需操作系统内核的干预.三.堆和栈的区别1.栈区(stack) - 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构的栈.使用一级缓存,他们通常都是被调度时处于存储空间中,调用完毕立即释放.栈先进后出
2.堆区(heap) - 一般由程序员分配释放,若程序员不释放,程序结束时可由 OS回收.存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是成为孤儿对象就能被减少),所以调用这些对象的速度慢一些.堆可以看成一棵树四.程序在内存中运行时,内存分几个区,各自的用途1.栈区
2.堆区
3.全局区(静态区)全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的两一块区域.程序结束释放
4.另外还有一个专门放常量的地方,程序结束时释放.五.引用与指针的区别指针指向一块内存,它的内容就是所指内存的地址,引用是某块内存的别名
1.指针是一个实体,而引用仅是个别名
2.引用只能在定义时被初始化一次,之后不可变,指针可变
3.引用使用时无需解易用(*),指针需要解引用
4.引用没有 const,指针有 const const:const 修饰谁,谁在整个程序运行过程中不能变
5.引用不能为空,指针可以为空
6.’sizeof 引用’得到的是所指向的变量(对象)的大小,而’sizeof 指针’的到的是指针本身(所指向的变量或对象的地址)的大小
7.指针和引用的自增运算意义不一样
8.从内存分配来
9228
看程序为指针变量分配内存区域,而引用不需要分配内存区域
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: