泛型编程

泛型编程允许编写与类型无关的代码,从而实现代码的重用。模板是泛型编程的基础,通过编写模板函数或模板类来实现类型无关的逻辑。

阅读全文 »

转化运算符

static_cast

  • 功能

    • 静态类型转换,用于在编译期确定的转换。
    • 能完成 C 语言中大部分的强制类型转换,但不能移除表达式中的 constvolatile 或者 __unaligned 属性。
阅读全文 »

C++ STL

C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

  • 容器(Containers): 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。

  • 算法(Algorithms): 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。

  • 迭代器(iterators): 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

阅读全文 »

数字系统

二进制

早期的计算机使用 真空管 来表示数据:通电表示1,断电表示0。这种方式形成了 二进制 系统,英文称为 binary。二进制与十进制的区别在于进位规则:十进制是逢十进一,而二进制是逢二进一。

在十进制中,数字 3456 的含义如下:

3456 = 3 × 10^3 + 4 × 10^2 + 5 × 10^1 + 6 × 10^0
阅读全文 »

Makefile 概述

makefile 是一种用于自动化编译和构建程序的脚本文件,特别是在Unix-like系统中。它定义了如何将源代码编译成可执行文件或其他目标文件。通过 make 工具读取 Makefile 中的规则,自动处理源文件的依赖关系和编译顺序,从而简化和自动化了构建过程。

编译与链接

在编译过程中,源文件(如 .c 文件)会被编译成中间目标文件(在Unix下是 .o 文件)。这个步骤称为编译。编译器检查语法和声明,生成目标文件。如果源文件包含函数或变量的声明而没有定义,编译器会发出警告,但仍会生成目标文件。

阅读全文 »

GCC编译

GCC 介绍

GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器。最初为GNU操作系统开发,现在已被多数类Unix系统(如Linux、BSD、MacOS X等)采用,甚至在Windows上也可以使用。

阅读全文 »

IO操作

CopyIO分两阶段(一旦拿到数据后就变成了数据操作,不再是IO):
1.数据准备阶段
2.内核空间复制数据到用户进程缓冲区(用户空间)阶段

在操作系统中,程序运行的空间分为内核空间和用户空间。
应用程序都是运行在用户空间的,所以它们能操作的数据也都在用户空间。

阻塞IO和非阻塞IO的区别在于第一步发起IO请求是否会被阻塞:
如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。

一般来讲:
阻塞IO模型、非阻塞IO模型、IO复用模型(select/poll/epoll)、信号驱动IO模型都属于同步IO,因为阶段2是阻塞的(尽管时间很短)。

同步IO和异步IO的区别就在于第二个步骤是否阻塞:
如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO
阅读全文 »

这里先额外介绍一下C++类的存储方式,然后介绍虚函数。

C++程序的内存格局通常分为五个区:全局数据区(data area),代码区(code area)、栈区(stack area)、堆区(heap area)(即自由存储区),文字常量区。全局数据区存放全局变量和静态变量,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。;所有类成员函数和非成员函数代码存放在代码区;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;文字常量区存储常量字符串,程序结束后由系统释放,余下的空间都被称为堆区。类的存储方式如下图所示:

阅读全文 »