[总结] C++ 知识点 《二》高级篇

简介: [总结] C++ 知识点 《二》高级篇

前言

感谢以上作者的整理,以下内容都是结合了我自己的一些理解。

一、高级篇

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

参考我的windows核心编程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下的进程

  1. 所有的进程都是PID为1的进程的子进程或子子进程
  2. 进程创建成功后,父子进程就会在各自独立的地址空间运行

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()

3.3 进程通信方式

IPC进程间通信

四、工作建议

1.刚到新岗位,多沟通,不要闷声干。

2.尽快熟悉,对自己明确的工作安排。

3.积极主动,不懂就问,和同事保持良好关系。

相关文章
|
7月前
|
安全 算法 编译器
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
【C++ 泛型编程 进阶篇】深入探究C++模板参数推导:从基础到高级
816 3
|
7月前
|
存储 人工智能 算法
【一站式备考指南】一文掌握 C++ 程序设计 课程 知识点
【一站式备考指南】一文掌握 C++ 程序设计 课程 知识点
130 0
|
7月前
|
算法 编译器 数据库
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
684 0
|
7月前
|
JSON JavaScript 前端开发
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
449 0
|
7月前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
922 2
|
7月前
|
并行计算 调度 C++
|
7月前
|
存储 C++ 索引
C++ 字符串完全指南:学习基础知识到掌握高级应用技巧
C++的字符串使用`string`类处理,如`string greeting = &quot;Hello&quot;`。字符串连接可通过`+`或`append()`函数实现。访问字符使用索引,如`myString[0]`。`length()`或`size()`可获取长度。`getline()`用于读取整行输入。注意转义字符如`\\&quot;`用于在字符串中嵌入双引号。使用`cin`读取字符串时,空格会终止输入,而`getline()`能读取整行。
67 0
|
6月前
|
存储 网络协议 编译器
【干货总结】Linux C/C++面试知识点
Linux C/C++基础与进阶知识点,不仅用于面试,平时开发也用得上!
621 17
|
6月前
|
Linux C++
c++高级篇(三) ——Linux下IO多路复用之poll模型
c++高级篇(三) ——Linux下IO多路复用之poll模型
|
6月前
|
缓存 监控 网络协议
c++高级篇(二) ——Linux下IO多路复用之select模型
c++高级篇(二) ——Linux下IO多路复用之select模型