文章列表

20k 34 分钟

本书主要设计 C++11/14 的新语言特性,Modern C++ 带来的各种改变是亡羊补牢,还是脱胎换骨,通过阅读本书可能会得到答案。

不得不说 C++11 之后的语言特性理解难度越来越高了,完全理解并作出比作者还高效精炼的总结实在是太困难,写作难度相比写《Effective C++》读书笔记的时候大大提高了。

看书是一件乐趣,写读书笔记可不是😢。但是就阅读《Effective C++》的经历而言,减慢阅读速度而留下记录是很重要的,不知本篇何时才能完成。

ps: 电力出版社的高博版翻译的错误实在有点多,正文中我看出来的已经更正 (隐式的)。同时本文涉及到的很多 C++ 新概念的详细语法和使用并不会解释。

在学习的过程中,非常推荐使用在线编译器 Compiler Explorer 以及 AI 问答工具快速验证想法。比如直接询问 gpt:一个形参为右值引用的函数 给他传参的时候可以传左值吗?

对此 gpt 给出的答案是 可以 ,并提供了一个例子

image-20241117183223299

但是实际上,compiler 给出的答案是否定的,所以,gpt 很好用,但验证还是有必要的。

image-20241117183525877

46k 1:17

C++ 是我最喜欢的一门语言,C++ programer 一直为其拥有的非同寻常的能力范围和表现力而自豪(当然如果能正确使用的话)。正如 Scott Meyers, 本书作者所言:学习一种编程语言的基础是一回事;学习如何用那种语言设计和实现高效率的程序完全是另外一回事。断断续续学习了两年的 C++ programing language, 我的追求从学会语言基础,逐渐变为追求更加高效,并同时具备高可扩展性和可维护性的编程。

Effetive C++ 是一本主要面向 C++ 03 标准及之前的 C++ 编程过程中的一些编程 guidelines 的,自 C++ 11 以来,C++ 不断推陈出新,关于一些场景作者提出的解决方案也许有了更好的替代方案。但作为一切的基础,以及一系列书目的开山之作(more Efective C++, Effective Modern C++),此书仍然被许多人认为是 CPP programer 进阶的必看书目。此读书笔记仅供我自己查阅,提供简单的总结与感想,以从作者引人入胜但对于已经认真体会的读者而言无益的行文中走出 (TLDR)。并对书中的一些问题尝试使用 C++ 11 后的新特性解决。

我不想成为一个语言学家,阅读之后还需要更多的编程练习来巩固所学习的知识。

432 1 分钟

此坑待填 # 2PC(two-phase commit) 2PC 是强一致,中心化的原子提交协议 两个阶段:准备阶段、提交阶段 两个角色:协调者 (coordinator), 参与者 (Participant) 深度理解:正确理解二阶段提交(Two-Phase Commit)_2 阶段提交 - CSDN 博客 # 第一阶段 第三点记录的日志有 redo log 和 undo log 只有所有的 Participant 都返回 yes 才会进入第二阶段。否则 coordinator 发送 global roolback, 各节点根据记录的 undo log 全局回滚,向 client...
3.3k 5 分钟

# golang - 入门 命令行词典 # golang 相关知识点 尝试了 goland 的基础语法,结构体使用,错误处理,基本的输入输出,命令行参数等。 体验了 go 自带的间结强大的 net 库,http 库等,可以非常轻松的进行 go 语言 struct 与 json 格式的序列化和反序列化。 # 效果 # 过程 首先对某翻译网站翻译的请求进行抓包,得到请求发出时的请求头。然后可以使用检查工具中的 copy as cURL 复制为 curl 命令 ​ 然后可搜索在线工具比如 curlconverter 将 curl 命令转化为 go 语言中发送 http...
5.3k 9 分钟

# 云原生 docker + k8s + springboot # 云原生的本质 根据微服务将应用进行细分,将每一部分打包放入对应的容器,动态统筹管理容器,实现资源利用最大化。 # 什么是 Docker Docker 是 Docker 公司开源的一种最流行的容器实现方案,极大方便了应用服务部署。 Docker 可以将应用、配置、和环境打包,形成了一个独立的类似于 iOS APP 形式的 应用,此应用可以直接分发到任意一个支持 Docker 的环境中,通过简单的命令即可运行。 Docker 使得容器化技术使用非常方便,极大地推进了容器行业的发展与容器技术标准化。 docker 口号:...
508 1 分钟

# 编译原理 05 - 目标代码生成 # RISC-V 指令集 精简指令集,精简的含义就是一条指令要么做运算,要么存,取内存。 # 寄存器 RISC-V 有 32 个寄存器,名称分别为 X0,X1...X31 但实际上不会按这些名称来使用,而是按照约定来使用,一些寄存器有专门的用途 X0: zero 寄存器,专门存放数字 0 ra: 存放 return address pc(X31): program counter # 指令 li : 加载立即数 li t0,0 add: 加法,有三个操作数: add t5,t3,t4 , t5 = t3+t4 addi:...
2.1k 3 分钟

# 编译原理 04 - 中间代码生成 # LLVM IR 简介 LLVM 这个项目与最初的名字含义已经完全不同了,可以将 LLVM 理解为全称。目前 LLVM 是开发新的编译器的基础。 前端经过语法分析,词法分析,生成 IR “IR 设计的优秀与否决定着整个编译器的好坏” 一个.c 文件对应生成一个.ll 文件。Module 实际上就是一个文件 file, Module 里有多个函数,一个函数具有多个基本块 (Basic Block), 每一个基本块都由多个指令构成。 使用 clang -S -emit-llvm factorial0.c -o f0-opt0.ll 表示用 clang...
1.5k 2 分钟

# 语义分析 # 符号表 用符号表保存我们已经定义了的变量或者函数以及其相关信息,在遍历语法分析树时,如果发现当前新出现的某些单元与符号表中的信息有冲突,我们就可以发现语义错误。 # 实现符号表 首先构建作用域树: 我们在这里犯了一个小错误,即把函数参数的作用域单独独立出来了,以便于我们编码,实际上函数参数作用域和函数作用域应该是要合并的。 作用域的指针指向父作用域,在查找某个变量是在哪个作用域时要循环从当前作用域到父作用域遍历。 之后可以通过递归遍历等方式进行语义相关的检查。 某个利用 antlr4 实现符号表的类图: scope 是作用域(持有一个 Map (name, symbol)...
9.7k 16 分钟

# 编译原理 02 - 语法分析 主要内容:如何用 antlr4 生成一个语法分析器。手写语法分析器比较困难,不作要求。 lesson1 任务: 用 cymbol 语言(龙书中提供的一种简化版 c 语言)写一段程序,并生成如下的函数调用关系图。 lesson2 任务:写一个简单的计算器 在为自己的语言编写语法分析器时,可能会遇到一些问题。 # 问题一:二义性文法 考虑下列定义: if a then if b then c else d 可以有两种解释 龙书上给的无二义性语法: 难题是如何证明没有二义性(见龙书) 在 antlr4...