网络编程小总结

#ifndef 和#pragma once有什么区别?

摘要: 一、相同点 两者的共同点都是为了避免同一个文件被 include 多次,但是 #ifndef #define #endif 不只有这个作用。 在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。

1.#pragma once
这个是编译器相关,就是说在这个编译系统上能用,在其他编译系统不一定行,即移植性差。不过现在基本上已经是每个编译器都有这个定义了。
此方式由编译器保证同一个文件不会被包含多次。注意:这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。于是不必再费劲想个宏名了,当然也就可以避免宏的名字冲突问题了。

缺点:如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。

2.#ifndef #define #endif
该方法与 C++ 语言相关,是 C++ 语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持 C++ 语言的编译器上都是有效的。如果写的程序要跨平台,最好使用这种方式。该方式由于是 C++ 语言本身支持,所以移植性好。它依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。另外,为了保证不同头文件中的宏名不冲突,故采取类似于_ABC_H_的取名方式。其中,abc.h为当前头文件名。

**总结:**两者都有避免头文件被重复包含的作用,但是#pragma once的移植性更差,且如果某个文件有多份拷贝,#pragma once 不能保证他们不会被重复包含;#ifndef #define #endif 的功能能更强大,他是C++中的宏定义,移植性更好,且也能保证内容完全相同的两个文件不会被不小心同时包含。

为什么不在文件的的前面声明using namespace std;而是要在每一个相对应的对象前加上std::cout.

假如我们一个文件不只一个命名空间,但是多个命名空间中都声明了同一种方法,我们使用不同命名空间中的同名方法时,就难以确定每个方法属于哪个命名空间,造成命名空间的污染。使用后者的优势在于我们可以清楚地知道每个方法来自于哪个命名空间。

初始化列表的好处是?

1.类成员中存在常量,如const int a,只能用初始化不能赋值

2.类成员中存在引用,同样只能使用初始化不能赋值。

3.提高效率

multimap、map和unorder_mao的区别是什么?

map是STL的一个关联容器,它提供一对一的hash

  • 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
  • 第二个可能称为该关键字的值(value);

map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。

map的底层是一颗红黑树

unorder_map的底层是hash表

multimap和map的功能类似,就不一一介绍了,下面主要说一下这两者的不同:

1、multimap中的key可以重复

2、multimap中没有重载operator[ ]功能

谈谈unordered_map和map的区别
1、内部实现机理不同:

map :map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找、删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树 (又名二叉查找树、二叉排序树–特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根结点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。

unordered_map :unordered_map内部实现了一个哈希表 (也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序都是无序的。哈表的概念见:详谈哈希表。

2、谈谈各自的优缺点:

map
1、优点:

(1)有序性,这是map结构最大的有点,其元素的有序性在很多应用中都会简化很多的操作。

(2)红黑树,内部实现一个红黑树使得map的很多操作在lg(n)的时间复杂度下就可以实现,因此效率非常的高。

2、缺点:空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间。

3、适用处:对于那些有顺序要求的问题,用map会更高效一些。

unordered_map
1、优点:因为内部实现了哈希表,因此其查找速度非常的快。

2、缺点:哈希表的建立比较耗费时间

3、适用处:对于查找问题,unordered_map 会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

3、总结:

1、内存占有率的问题就转化成红黑树 VS Hash表,还是unorder_map占用的内存要高。

2、但是unorder_map执行效率要比map高很多

3、对于unordered_map 或unordered_set 容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的。

C++有几种类的成员函数?(6)
  • 一、构造函数(特殊的成员函数)
  • 二、析构函数(特殊的成员函数)
  • 三、拷贝构造函数(特殊的成员函数)
  • 四、赋值运算符重载函数
  • 五、取地址操作符重载 和 const修饰的取地址操作符重载
单例模式:
什么是单例模式?

单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。

单例模式有两种类型:
  • 懒汉式:在真正需要使用对象时才去创建该单例类对象
  • 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXRBqKAL-1665736592451)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20220728144322594.png)]

进程与线程的区别?
  1. 定义不一样,进程是执行中的一段程序,而一个进程中执行中的每个任务即为一个线程。

  2. 一个线程只可以属于一个进程,但一个进程能包含多个线程。

  3. 线程无地址空间,它包括在进程的地址空间里。

  4. 线程的开销或代价比进程的小。

并发与并行的区别?

二者都有“多个线程/进程同时执行”的意思:

但是

  • 并行是指两个或者多个事件在同一时刻发生,而并发是指两个或多个事件在同一时间间隔发生。
  • 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
通过环境变量设置日志级别 ,环境变量是自己设置的,凭什么能代表日志的级别呢?

相当于宏替换,因为在项目当中我们要经常使用日志级别,将其设置在环境变量当中可以及时的进行替换;

为什么要设置环境变量?

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如临时文件夹位置和系统文件夹位置等。

环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程

网络IO的两个阶段

第一阶段:数据的准备阶段,将网卡上的数据包放到内核上

第二阶段:数据的拷贝阶段、从内核的缓冲区拷贝到用户空间

IO演进
  • 阻塞:读到缓冲区,数据没有准备好就一直阻塞着,缺点是占用线程不干事情

  • 非阻塞(setnoblack):当访问内核缓冲区的时候数据没有准备好,立即返回,缺点是空转CPU不停地进行系统调用,产生大量的终端

  • 同步

  • 异步

IO复用
select:
  • 支持的文件描述符有上限 1024
  • 用户空间拷贝到内核空间
  • 内核空间再拷贝到用户空间
  • 时间复杂度为O(n)
poll:
  • 底层数据结构为链表
  • 还是要发生两次拷贝
  • 时间复杂度还是为O(n)
epoll:
  • 红黑树(为什么不用哈希表):因为我我们知不道哈希表在什么时候会扩容。
  • ET:边沿触发,ET在发现有我们关注的事情发生之后,会立即返回,并且sleep这一事件的epoll_wait,不管该事件有没有结束。
  • **LT:**电平触发,当发现文件描述符上有我们感性的事件时,触发事件的回调函数,但是当文件描述符上的数据没有读取完毕时,epoll_wait依旧会被使用,直到数据处理完毕

reactor:

将事件和事件的处理方式绑定到一起,达到异步的处理效果。

服务器端的reactor回调函数该如何写?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8sY7spRx-1665736592456)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20220801180320829.png)]

主线程负责监听,当监听到事件之后,进行处理,子线程有两个任务一是处理主线程分发下来的任务,第二是处理cfd上发生的IO事件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mJkiAQWw-1665736592462)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20220803153026816.png)]

Redis和mysql的基础架构都是CS架构,在实现项目的过程中,我们是封装一个客户端去访问mysql和Redis的服务器。

分层文件系统
namespace
cgroup

在这里插入图片描述

删除容器之前需要先将容器停掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值