面试题
c++#define与inline区别: 特性 #define(宏) inline(内联函数) 处理阶段 预处理阶段(文本替换) 编译阶段(编译器决策) 类型检查 无类型检查,直接文本替换 有类型检查,遵循函数参数规则 作用域 全局(从定义处开始生效直到#undef) 遵循作用域规则(类内、命名空间等) 调试支持 替换后代码难以调试 可生成调试符号(即使内联失败) 安全性 易因运算符优先级或副作用导致错误 行为与普通函数一致,更安全 autoauto类型推导通常与模板类型推导相同,但是auto可以推导{}是初始值列表 auto必须初始化,不然编译错误 auto可以使用尾随返回类型,省略类中枚举类型的作用域 auto推导两个bool相加为int,对bool类型提升了 decltypedecltype是一个关键字,用于查询变量或表达式的类型。具体应用与函数模板中推导复杂的返回类型,例如: 12template<typename Func, typename... Args>auto submit(Func&& f,...
xv6
book-riscv操作系统接口操作系统管理和抽象硬件,使得程序共享硬件、共享数据 内核使用cpu提供的硬件保护机制实现保护模式 文件描述符接口将文件、管道和设备之间的差异抽象出来,使它们看起来都像字节流。我们将输入和输出称为 I/O fork和exec分开使得可以对子进程IO重定向 如果两个文件描述符是通过一系列fork和dup调用从同一个原始文件描述符派生出来的,那么它们共享一个偏移量; 父子进程各自的文件描述符表条目指向同一个文件表项 2>&1使得错误输出重定向到文件名描述符1,如果不加&表示文件1 操作系统架构操作系统要满足复用,隔离和交互 为实现隔离,将资源抽象为服务;Unix在进程之间透明地切换硬件处理器,根据需要保存和恢复寄存器状态;文件描述符简化了交互,内核为流水线失败进程生成eof RISC-V三种指令模式:机器模式(Machine Mode)、用户模式(User Mode)和管理模式(Supervisor...
go
gobyeaxmple 介绍并发编程 异步模型 1、seamless轻量级跨核心抢占式 2、csp and shared by communicating goroutines比线程切换快10倍,运行时增长栈,消除同步与异步代码之间区别 使用语言内建的通道消除锁需求 安装: rm -rf /usr/local && tar -xvf /usr/local xxx go mod ini:初始化你的代码模块,通常为保存源代码的存储库路径 1234567package mainimport "fmt"func main() { fmt.Println("Hello, World!")} 跟py挺像的,导入fmt包,也可以通过go mod tidy导入别人的包 如import "rsc.io/quote",也可以通过go build生成二进制文件 123456package mainimport "fmt"import...
汇编基础
汇编程序由4种类型的组件组成:指令(instruction)、伪指令(directive)、标号(label)及注释(comment) AT&T和Intel语法AT&T语法会在每个寄存器前面加上%,每个常量前加上$,并且源操作数在目的地操作数前 mov $0x1, %eax mov eax, 0x1 x86指令的机器级结构x86指令由可选前缀(prefix)、操作码(opcode)及零个或多个操作数(operand)组成。注意除了操作码外,剩余部分都是可选的 寄存器通用寄存器 其他寄存器: rip:指令寄存器 rflag:标志寄存器,用于一些条件,判断等标志位 cs、ds、ss、es、fs及gs段寄存器:x86-64目前已废止内存分段 常见指令 指令 描述 数据传输 mov dst,src 将src赋给dst xchg dst1,dst2 互换dst1和dst2 push src 将src压栈,并递减rsp pop dst 出栈赋给dst,并递增rsp 算术 add dst, src dst...
huffman
...
红黑树
Rbtree学习 rbtree的几个原则 (颜色属性)节点非黑即红 (根属性)根节点一定是黑色 (叶子属性)叶子节点(NIL)一定是黑色 (红色属性)每个红色节点的两个子节点,都为黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) (黑色属性)从任一节点到其每个叶子的所有路径,都包含相同数目的黑色节点。 rbtree平衡调整的两个手段: 旋转 和 变色 rbtree的平衡调整需要关注两个场景:当父亲节点为红色 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475叔叔节点为红: 即父亲叔叔都为红-》调整为黑,同时爷爷变红 爷爷向上递推调整叔叔节点为黑: 1、LL型失衡:变色、对爷爷左旋或右旋 privot,root颜色取反,旋转 2、LR型失衡:对父亲旋转-》LL型##...
c++内存模型和原子操作
局部性原理缓存是一个非常常用的工程优化手段,其核心在于提升数据访问的效率。缓存思想基于局部性原理,这个原理包括时间局部性和空间局部性两部分: 时间局部性:指程序在访问某个数据时,通常会在不久的将来再次访问该数据。例如,一个循环结构中,程序会反复访问数组中的某个元素,这就是时间局部性的体现; 空间局部性:指程序在访问某个数据时,通常会访问该数据所在的一段连续内存。例如,一个数组中相邻的元素通常会被一起访问,这就是空间局部性的体现。 CPU缓存cpu和内存发展的不平衡,速度相差大,在中间引入缓存,每次cpu读取数据时先从缓存读取 cpu的缓存分为L1(包含L1 I和L1 D,分别存储指令和数据),L2是每个cpu独有的,L3为多个cpu共享 每一个cpu缓存由多个Cache Line缓存行组成,并且主存根据缓存行大小划分为多个主存块,以便对应的主存块直接加载到缓存 缓存行结构为:| 状态位 | 组标记 | 数据块 | 状态位:标记该Cache...
并发技术future类
Future使用搭配async启动一个异步任务,返回一个future对象 1234std::future<int> res = std::async(std::launch::async, []{ std::this_thread::sleep_for(std::chrono::seconds(5)); return 1;}); int i =...
条件变量实现安全队列和信号量
条件变量实现安全队列一些源码的解释 12#include <condition_variable>std::codition_variable cv; // wake up one waiter 1void notify_one() noexcept // wake up all waiters 1void notify_all() noexcept Nothing to do to comply with LWG-2135 because std::mutex lock/unlock are nothrow 1void wait(unique_lock<mutex>& _Lck) // wait for signal and test predicate 123456template <class _Predicate>void wait(unique_lock<mutex>& _Lck, _Predicate _Pred)...
并行计算及两种并发模型
并行计算利用cpu多核计算子集,然后合并返回结果;例如在快排中,本身计算privot左边,交给子线程计算privot右边 倘若我们要实现一套通用的规则而不依赖于存储容器,那就可以使用函数式编程 函数式编程:程序由一系列函数组成,每一步计算就是函数求值,并且不改变状态和数据(那样拷贝数据返回新值挺费内存吧) 12345678910111213141516171819202122232425template<class T>std::list<T> parallel_quick_sort(std::list<T> input) { if(input.empty()) return input; std::list<T> result; // 转移,前插 result.splice(result.begin(), input, input.begin()); T const& pivot = *result.begin(); 基于privot拆分链表 auto...