C++ 类内存模型

C++类的内存模型涉及多个方面,包括对象的布局、成员的存储、继承、多态等。为了更好地理解C++类的内存模型,我们将从以下几个关键点进行探讨:

阅读全文 »

什么是清单模式?

  1. 在工程根目录的CMakeLists.txt文件中添加如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
if(CMAKE_HOST_WIN32)
set(CMAKE_TOOLCHAIN_FILE
"C:/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file")
elseif(CMAKE_HOST_APPLE)
set(CMAKE_TOOLCHAIN_FILE
"/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file")
elseif(CMAKE_HOST_UNIX)
set(CMAKE_TOOLCHAIN_FILE
"/usr/local/share/vcpkg/scripts/buildsystems/vcpkg.cmake"
CACHE STRING "Vcpkg toolchain file")
endif()
阅读全文 »

UNIX

设置代理,Terminal关闭时自动恢复

1
2
export https_proxy="http://localhost:port"
export https_proxy="http://192.168.40.50:7890"
阅读全文 »

1. TCP 三次握手四次挥手过程

三次握手过程

  1. 第一次握手:客户端向服务器端发送连接请求报文段,包含自身数据通讯初始序号,进入SYN-SENT状态。
  2. 第二次握手:服务器端收到连接请求报文段后,如果同意,发送应答,包含自身数据通讯初始序号,进入SYN-RECEIVED状态。
  3. 第三次握手:客户端收到应答,最后向服务器端发送确认报文,进入ESTABLISHED状态,此时成功建立长连接。
阅读全文 »

1. 进程和线程的区别

  1. 进程有独立的地址空间,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间;
  2. 进程和线程切换时,需要切换进程和线程的上下文,进程的上下文切换时间开销远远大于线程上下文切换时间,耗费资源较大,效率要差一些;
  3. 进程的并发性较低,线程的并发性较高;
  4. 每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制;
  5. 系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了 CPU 外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源;
  6. 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮;
阅读全文 »

1. STL 中有哪些常见的容器

  1. 顺序容器 容器并非排序的,元素的插入位置同元素的值无关,包含 vector、deque、list;
    1. vector:动态数组 元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能;
    2. deque:双向队列 元素在内存连续存放。随机存取任何元素都能在常数时间完成(仅次于 vector )。在两端增删元素具有较佳的性能(大部分情况下是常数时间);
    3. list:双向链表 元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取;
  2. 关联式容器 元素是排序的;插入任何元素,都按相应的排序规则来确定其位置;在查找时具有非常好的性能;通常以平衡二叉树的方式实现,包含set、multiset、map、multimap;
    1. set/multiset set中不允许相同元素,multiset 中允许存在相同元素;
    2. map/multimap map 与 set 的不同在于 map 中存放的元素有且仅有两个成员变,一个名为 first,另一个名为 second,map 根据 first 值对元素从小到大排序,并可快速地根据 first 来检索元素。map 和multimap 的不同在于是否允许相同 first 值的元素
  3. 容器适配器 封装了一些基本的容器,使之具备了新的函数功能,包含 stack、queue、priority_queue;
    1. stack:栈 栈是项的有限序列,并满足序列中被删除、检索和修改的项只能是最进插入序列的项(栈顶的项),后进先出
    2. queue:队列 插入只可以在尾部进行,删除、检索和修改只允许从头部进行,先进先出;
    3. priority_queue:优先级队列 内部维持某种有序,然后确保优先级最高的元素总是位于头部,最高优先级元素总是第一个出列。
阅读全文 »

1. C++引用的概念

  1. 引用(Reference)是 C++ 相对于 C 语言的一个扩充。引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据。引用类似于 Windows 中的快捷方式,一个可执行程序可以有多个快捷方式,通过这些快捷方式和可执行程序本身都能够运行程序;引用还类似于人的绰号(笔名),使用绰号(笔名)和本名都能表示一个人;
  2. 基本语法 typename & ref = varname;
  3. 使用引用的注意事项:
    1. 引用必须引用合法的内存空间;
    2. 引用在定义时必须初始化;
    3. 引用一旦初始化后,就不能再引用其它数据;
    4. 引用在定义时需要加上 &,在使用时不能加 &,使用时加 & 表示取地址;
    5. 函数中不要返回局部变量的引用;
  4. 引用的本质是指针,低层的实现还是指针;
阅读全文 »

1. C 语言和 C++ 语言的区别

  1. C 语言是面向过程的语言,而 C++ 支持面向对象,所以 C 语言自然没有面向对象的封装、继承、多态等特性,也不支持面向对象的一些语法;
  2. C++ 支持函数重载,C 语言不支持;
  3. C 程序中如果函数没有任何参数需要将参数定义为 void 以此来限定函数不可传递任何参数,如果不进行限定让参数表默认为空其意义是可以传递任何参数,在 C++ 中,不带参数的函数表示函数不能传递任何参数;
  4. C 语言 struct 中不能有函数,而 C++ 语言 struct 中可以有函数;
  5. C 语言函数参数不支持默认值,而 C++ 语言支持参数默认值;
  6. C++ 语言支持内联函数,而 C 语言不支持;
  7. C++ 语言支持引用,而 C 语言不支持;
  8. C 语言采用 malloc 和 free 函数动态申请和释放内存,而 C++ 使用 new 和 delete 运算符;
  9. C 语言中只有局部和全局两个作用域,而 C++ 中有局部、全局、类、名称空间作用域;
阅读全文 »