计算机易混淆概念(待续)

计算机网络

1、TCP与UDP区别

(1)TCP是面向连接的,UDP是无连接的
(2)TCP提供可靠服务,UDP提供的是不可靠服务。TCP通过建立连接,超时重传,ACK,拥塞控制,校验和等机制保证数据一定到达目的地;UDP是无连接的不需要建立连接也不需要维护连接只尽可能的交付数据,UDP的数据有序、重组、重复等都有应用层提供,UDP仅实现了最基本的传输层协议。
(3)TCP数据报首部20个字节,UDP首部8个字节。
(4)TCP把数据看成无结构的字节流,UDP把数据看成数据报。
(5)TCP有拥塞控制,UDP是无连接的其吞吐量仅受应用程序生成数据的速度、带宽和源端目的端主机性能限制。
(6)TCP是端到端的,UDP可以一对多,多对一或多对多。
(7)TCP是全双工的,UDP是单工的。

使用TCP还是UDP:
TCP提供的是可靠传输,当对可靠性要求较高时使用TCP,比如我们使用的QQ就是基于TCP协议的。
UDP的特点是快,延迟小,当对实时性要求高时,比如IP电话,对速度和实时性要求高的广播和多播也是用UDP,DHCP,RIP等是基于广播协议的。

2、IP地址

(1)IP地址划分
IP地址划分
(2)五类IP地址范围
IP地址范围
(3)私有IP地址
10.0.0.0——10.255.255.255
172.16.0.0——172.31.255.255
192.168.0.0——192.168.255.255

C++语言

1、引用与指针

(1)指针是一个实体,而引用仅是个别名;
(2)引用使用时无需解引用(*),指针需要解引用;
(3)引用只能在定义时被初始化一次,之后不可变;指针可变;
(4) 引用没有 const,指针有 const;
(5) 引用不能为空,指针可以为空;
(6)”sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
(7)指针和引用的自增(++)运算意义不一样;
(8)从内存分配上看:程序为指针变量分配内存区域,而引用不需要分配内存区域。

2、数组与指针

(1)数组作为函数参数传递的时候,会退化为指针
(2)数组名是一个常量,不能进行自增或自减操作
(3)使用sizeof()计算数组时得到的是数组有效的长度,而sizeof()计算指针时,得到的仅仅是指针的大小在32位系统中为4字节。
(4)对于char a[] = “abcl”; char* p = “abcd”,我们可以通过a[1]=’d’修改其值,但是不可以p[1]=’d’修改其值,因为p所指向的”abcd”是一个常量值。
(5)指针时间接访问数据,数组是直接访问数据。

3、C++中四种类型转换

(1)static_cast
语法:static_cast(expression)
作用:static_cast是最常用的一种类型转换操作,其是把expression转换为type-id类型,但是没有运行时类型安全检查。
用法:
a. 基类与派生类之间指针与引用的转换,进行上行转换时是安全的,进行下行转换时是不安全的因为没有运行时类型检查
b. 基本类型转换,比如int转换为float型,由开发者保证转换的安全性
c. void*转换为目标类型的空指针
d. 把任何类型的表达式转换为void型
注:static_cast不能去掉expression的const、volitate、_unaligned属性。
(2)dynamic_cast
语法:dynamic_cast(expression)
作用:当type-id必须是类类型指针或void*,主要用于类层次间的转换,也可以实现交叉转换。上行转换和static_cast效果一样,下行转换比static_cast更安全,同时基类中必须有虚函数,因为运行时类型检查需要运行时类型信息,而这个信息是喝虚表一起存储的。
(3)const_cast
语法:const_cast(expression)
作用:修改类型的const 或 volatile属性。
用法:
a. 常量指针被转换为非常量指针
b. 常量引用被转换为非常量引用
c. 常量对象被转换为非常量对象
(4) reinterprest_cast
语法:reinterpret_cast(expression)
作用:type-id必须是指针或引用,他仅仅是对bit位进行了重新解释比如把expression的bit为表示解释为type-id类型的表示。
比如, char tch = ‘0’;
char* ch = &tch;
int ip = reinterpret_cast(ch);
int n = 9;
double dn = reinterpret_cast < double& > (n);
ch中存放的是tch的首地址,把这个首地址解释为一个int型,n是一个整数9,把他按照double的规则解释为dn,此时dn是无效的。

4、static变量和函数

(1)静态全局变量
该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。而全局变量的作用域是整个源文件。
(2)静态局部变量
该变量在全局数据区分配内存;静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
(3)静态函数
静态函数不能被其它文件所用;其它文件中可以定义相同名字的函数,不会发生冲突;
(4)静态成员数据
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程
序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据
成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;静态数据成员和普通数据成员一样遵从public,protected,private访问规则;因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ;静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;
同全局变量相比,使用静态数据成员有两个优势:静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;
(5)静态成员函数
与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员
一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数
总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于
不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。关于静态成员函数,可以总结为以下几点:出现在类体外的函数定义不能指定关键字static;静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成员;由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)
<对象名>::<静态成员函数名>(<参数表>)
调用类的静态成员函数。

总结:
把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件
static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

5、C++与Java区别

(1)JAVA诞生于C++基础之上,是一门纯面向对象的语言;而C++除了有面向对象的特点,依然具有C语言的面向过程的特性;
(2)内存管理方面,JAVA具有自带的GC垃圾回收器,程序员无需再在垃圾回收方面专门编写代码,只需注意利用GC的特性进行内存的自动回收;而C++需要程序员自身利用free()等函数进行垃圾回收,具有更大的工作量;
C++没有垃圾回收是害怕严重的空间和时间开销,也害怕实现和移植垃圾回收系统而带来的复杂性,而且垃圾回收将使C++不适合做许多底层工作。
(3)语言特点上,C++保留了C语言重要的指针变量,而JAVA则取消了这一概念,用引用来直接表示对象;
(4)语言分类上,C++属于编译型语言,通过编译链接等来运行代码,在不同的编译环境中需进行不同的处理;而JAVA属于解释型语言,JAVA代码通过转变成字节码在自己的JVM虚拟机上运行,跳出了开发环境的限制;
(5)语言效率上,C++往往具有更高的效率,JAVA因为需要在自身虚拟机上运行,效率稍弱,但具有更好的可移植性;
(6)其他细节差异如JAVA采用unicode编码,而C++的变量属性往往跟编译环境有关;JAVA取消了goto语句而C++保留等。

当同一个应用程序需要在不同平台上运行时宜采用JAVA,因其良好的可移植性,JAVA一般作为应用层; 当要求程序具有高效率时宜采用C++,如系统底层环境的开发。

6、C++面向对象的体现

⑴对象唯一性。
每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。
⑵抽象性。
抽象性是指将具有一致的数据结构和行为的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
⑶继承性。
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。
⑷多态性
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。多态性允许每个对象以适合自身的方式去响应共同的消息。

7、堆与栈的区别

(1)分配与释放
stack:由系统自动分配,自动释放。
heap:由程序员自己申请,并指明大小,使用完自己负责释放。
(2)申请时系统响应方式
stack:只要stack的剩余空间大于所申请的空间,系统为程序提供内存,否则报stack overflow。
heap:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的 首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
(3)申请大小限制
stack:在Windows下栈的栈顶和栈的最大容量都由系统预先设定好,栈是向低地址扩展的,栈空间一般较小(2M)。
heap:堆是向高地址扩展的,堆的大小受限于计算机系统中有效的虚拟内存。
(4)申请效率
stack:栈是由系统自动分配,速度快,但程序员无法控制。
heap:堆由程序员控制分配,速度较慢,而且容易产生碎片,不过用起来方便,灵魂。(在Windows下最好使用VirtualAlloc分配内存,它既不是在堆上也不是在栈上而是在进程的地址空间中保留一块内存,速度快)
(5)存储内容
stack: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的普通局部变量。
heap:一般堆的头部存储堆的大小,堆中具体内容由程序员负责。

8、struct与class的区别

(1)struct成员的默认访问权限是public,class默认访问权限是private
(2)在定义模板参数时可以使用class但不能使用struct
(3)struct继承的默认方式是public,class是private
(4)class和struct如果定义了构造函数都不能使用{}初始化,
class若没有定义构造函数,且成员都是public则可以使用{}初始化;struct没有定义构造函数,可以使用{}初始化。比如:
struct node obj = {1,2,3};

操作系统

1、进程与线程通信机制

进程通信机制:文件映射,共享内存,Pipe ,Named Pipe,Socket,Signal,DLL,Semaphore(既可以用于进程间也可用于同一进程不同线程),邮件槽,消息(事件),消息队列

进程/线程同步机制:临界区,互斥,信号量(Semaphore),事件

管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
套接字( socket ) : 套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

2、进程与线程联系与区别

进程:具有一定独立功能的程序关于某个数据集合的一次运行,进程是系统进行资源分配的基本单位。
线程:是进程的一个实体,是CPU进行调度的基本单位,线程基本不拥有系统资源,只拥有一点运行中必不可少的资源(程序计数器,寄存器和栈)。
进程与线程联系:同一个进程中的线程共享进程中所有的资源,一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以并发执行。
进程与应用程序区别:应用程序作为静态文件存储在计算机系统的硬盘等存储空间中,而进程是处于动态条件下由操作系统维护的系统资源管理的实体。

线程共享的内容包括:
1.进程代码段
2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)
3.进程打开的文件描述符、
4.信号的处理器、
5.进程的当前目录和
6.进程用户ID与进程组ID

线程独有的内容包括:
1.线程ID
2.寄存器组的值
3.线程的堆栈
4.错误返回码
5.线程的信号屏蔽码

3、同步机制准则

同步机制应该遵循的基本准则
空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态,允许一个请求进入临界区的进程立即进入临界区,以有效利用临界资源
忙则等待:当已有进程处于临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问
有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态
让权等待:当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态

4、静态链接库与动态链接库

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持。
lib有静态lib和动态lib之分:
静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序。
动态lib相当于一个h文件,是对实现部分(.dll文件)的导出部分的声明。编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持。
(1)静态链接库
优点:
a. 代码装载速度快,执行速度比动态链接库快。
b. 只要保证开发者计算机中有正确的.lib文件,在以二进制形式发布程序时不用考虑用户计算中是否有.lib文件存在及版本问题。
缺点:
a. 使用静态链接库生成的.exe文件体积较大,代码冗余多。
b. 静态链接库中不能再包含其他的动态链接库或静态链接库
(2)动态链接库
优点:
a. 更加节省内存
b. DLL文件与.exe文件独立,只要保证输出接口不变,更换DLL文件不会对.exe文件的执行造成影响,极大的提高了可维护性和可扩展性。
c. 适合大规模软件开发,使开发过程独立,耦合度低。
d. 动态链接库中还可以包含其它的动态链接库或静态链接库。
缺点:
a. 使用动态链接库的应用程序本身不是完备的,它依赖于DLL。如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件就会都挂掉。

数据库

1、数据库视图不可以更新的

数据库视图包含下列结构是不可以更新的
a. 集合运算符 union,union all, intersect,minus
b. distinct关键字
c. group by,order by,connect by,或者start with
d. 子查询
e. 分组函数
f. 需要更新的列不是视图定义的
g. 具有连接查询(可以更新键值保存表的数据)
h. 违反基表的约束条件;连接视图是指基于多表连接查询创建的视图(一般不容易修改,但通用instead of触发器可以实现修改的功能)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值