前言
感谢以上作者的整理,以下内容都是结合了我自己的一些理解。
一、高级篇
1.1 指针
指针定义:值为地址,指向内存。
1.2 引用
左值引用
定义:变量的别名,初始化即定义。
左值引用在汇编层面其实和普通的指针是一样的
int a = 10; int &b = a; // 定义一个左值引用变量 b = 20; // 通过左值引用修改引用内存的值
c++ 11 特性:右值引用
C++对于左值和右值没有标准定义,但是有一个被广泛认同的说法:
- 可以取地址的,有名字的,非临时的就是左值;
- 不能取地址的,没有名字的,临时的就是右值;
不能取地址的,没有名字的,临时的就是右值
类型 && 引用名 = 右值表达式;
int &&var = 10;
右值引用的存在并不是为了取代左值引用,而是充分利用右值(特别是临时对象)的构造来减少对象构造和析构操作以达到提高效率的目的。
二、重点
2.1 指针和引用的共同点和区别点
2.1.1 共同点
1. 指针和引用都可以作为形参,改变实参的值。
举例
void function(Object *pObj)
等价于
void function(Object & obj)
2.1.2 区别点
1.定义不同
指针是一个变量,存储的是一个地址,指向内存的一个存储单元。
引用是原变量的一个别名,跟原来的变量实质上是同一个东西。
2、指针可以有多级,引用只能是一级
有意思的是:n级指针效果等于 n-1级指针+&
例如:
void Func(Object *** pppObj); 等价于 void Func(Object **& pprObj);
3、指针可定义时不初始化,引用必须定义时初始化
4、指针可以指向NULL,引用不可以为NULL
5、指针初始化之后可以再改变,引用不可以
6、sizeof 的运算结果不同
指针返回 指针大小;
引用返回原类型大小。
int a = 996; int *p = &a; int &r = a; cout << sizeof(p); // 返回 int* 类型的大小 cout << sizeof(r); // 返回 int 类型的大小
7、自增运算意义不同
8、指针和引用作为函数参数时,指针需要检查是否为空,引用不需要
2.2 main函数之前执行什么操作
1.设置栈指针;
2.初始化static静态和global全局变量,即data段的内容;
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL;
4.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数。
像Windows平台是根据编码格式Unicode或者多字节确定XXXCRTStartup函数再调用main
三、难点
3.1 内存管理
3.1.1 RAII资源机制
3.1.2 GC垃圾回收机制
3.2 Windows
Windows Session会话相关
Session会话:类似于一个域,然后里面有一堆进程
终端服务命名空间 分为以下几种:
- 全局终端服务命名空间:所有客户端都能访问的内核对象要放在这个命名空间。
对于两个或多个会话正在运行同一个应用程序的情况,这样的安排可以避免会话之间彼此干扰,一个会话不会访问另一个会话的对象,即使对象的名称相同(关键点),
- 本地终端服务命名空间: 不同的用户可以登录不同的会话,并分别启动自己的用户应用程序。每个用户自己的命名空间,用于存放只有自己能访问的内核对象.
- 专有终端服务命名空间: 自定义一个前缀(和Global和Local类似)并把它作为自己的专有命名空间使用
[笔记]Windows核心编程《二》内核对象 Session
https://blog.csdn.net/qq1113673178/article/details/115609680
参考:https://blog.csdn.net/gzzheyi/article/details/8907938
3.2 POSIX 可移植系统调用接口
POSIX下的进程
- 所有的进程都是PID为1的进程的子进程或子子进程
- 进程创建成功后,父子进程就会在各自独立的地址空间运行
POSIX下的kill()系统调用
向进程发送信号的作用
POSIX 进程间通信方式
- 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。
- 命名管道(Named Pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
- 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生
- 消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存(Share Memmory):使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。 是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
- 内存映射(Mapped Memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
- 信号量(Semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
- 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
信号
关于exit()和_exit()的描述
C进程结束时调用_exit()不会处理I/O缓冲区,而exit()会处理缓冲区里面的数据
进程从创建到消亡,经历的步骤
fork()——》exec——》wait()——》exit()