Luyu Huang's Tech Blog

谈谈 C++ 中的 const

C++ 用关键字 const 标识一个类型不可变. 这其实很容易理解. 不过, 对于 C++ 而言, 简单的概念也有很多可以讨论的. 我们来看一个问题. 问题 我们知道 const 可以用于修饰成员函数, 标识这个函数不能修改这个类的数据. 假设一个类有一个指针类型的成员 T *p, 我们希望通过 get() 方法获取 p 所指向的对象的引用. 如果 get() 被 const 修饰, 它应该返回什么类型, 是 T& 还是 const T& 呢? class C { public: ??? get() const { return *p; } private: T *p; }; 可能很多同学很自然地认为应该返回 const T&, 因为...

Read more

树形动态规划: 如何处理子节点依赖父节点的问题

动态规划规划是一种很常见的算法. 它的思路基本上是将大问题转化成小问题, 大问题依赖小问题的结果. 常见的动态规划有一维动态规划, x = N 的问题可能依赖 x = N - 1 的问题 这样只要我们知道 x = 0 的问题的解, 就能逐步推出 x = N 的问题的解. 或者有二维动态规划, x = N, y = M 的问题可能依赖 x = N - 1, y = M 和 x = N, y = M - 1 的问题. 这样我们也可以从 x = 0, y = 0 的问题的解逐步推出 x = N, Y = M 的问题的解. 但有一类特殊的动态规划, 子问题之间的依赖关系是网状的 如果把子问题看作节点, 依赖关系看作边, 整个问题就可以看作一个无向图. 如果这个图没有环路, 那...

Read more

使用 gperftools 分析程序性能

gperftools 是谷歌推出的一套非常强大的性能分析工具集. 它主要有这三个功能: 分析 CPU 性能, 能够统计出一段时间内各个函数的执行时间, 帮助我们找出耗时的代码; 分析内存占用情况, 能够统计出某一时刻各个函数分配的内存大小, 帮助我们找出内存占用高的代码, 也能帮助我们定位内存泄露; 自动检查内存泄露. gperftools 还包含一个高性能内存分配器 tcmalloc, 我们可以用它代替 glibc 的 ptmalloc. tcmalloc 自带统计功能, 内存分析和检查内存泄露就靠它. 本文介绍 gperftools 在 Linux 下的一些常见的用法. 如果你需要使用 gperftools 分析 Linux (服务器) 程序, 这篇文章可以当...

Read more

Jekyll Email Protection

A few months ago, I migrated my blog from Cloudflare to my cloud server. Since then, I've received more spam than before. I found the reason is that Cloudflare has a feature that protects email from crawlers. Cloudflare scans your HTML pages and replaces all mailto links with encoded URLs, then insert a Javascript that will decode them when the ...

Read more

[翻译] x86 汇编的基础介绍

原文 A fundamental introduction to x86 assembly programming 0. 介绍 x86 指令集架构是近 20 年来我们家庭电脑和服务器所使用的 CPU 的核心. 能够阅读和编写低级汇编语言是一项很强大的技能, 这能够让你写出更高效的代码, 使用 C 语言中无法使用的机器特性, 以及对编译过的代码进行逆向工程. 不过起步可能是一项令人生畏的任务. Intel 的官方文档手册足足有一千多页. 二十年间的演化需要不断地向后兼容, 产生了这样的景观: 不同年代设计原则的冲突, 各种过时的特性, 一层又一层的模式转换, 以及各种有例外的样式. 在这个教程中, 我会帮助你深刻地理解 x86 架构的基础原则. 我会更多地专注在为正在发生的事情...

Read more

2021 Annual Summary

I didn't really do so many things in 2021 compared to last year, but at least I kept some good habits like learning English and doing LeetCode. The most important thing this year was I joined a big company, which was a major goal in the past few years. That means I left Beijing, a city I lived in for nearly 4 years since I graduated. As I menti...

Read more

深入理解 KMP 算法

字符串匹配是非常常用的算法. 它要做的是, 对于模式串 t, 找到它在目标串 s 中第一个出现的位置. 例如 t = "abcab", s = "ababcabd", 算法就应该返回 2. 说起字符串匹配, 不得不提到 KMP 算法. KMP 是一个很厉害的算法, 它非常巧妙, 能在线性时间复杂度内完成字符串匹配. 本文我们来了解它. 本文会用到 Python 的切片语法表示子串. 如果你不熟悉 Python, 只需要记住: s[:k] 表示 s 长度为 k 的前缀, s[-k:] 表示 s 长度为 k 的后缀. 此外字符串的下标从 0 开始, 因此 s[:k] 的最后一个字符为 s[k-1]. 匹配算法 粗略地说, KMP 算法利用了字符串的一个性质: 字符串的尾部有可能与自己...

Read more

做了一次服务迁移

之前我用树莓派挂载移动硬盘, 在上面部署 NextCloud, 然后使用 Cloudflare Tunnel 做内网穿透, 当作 NAS 使用. 但是 Cloudflare 在国内的访问速度实在太慢. 更糟糕的是, 最近一段时间, 我域名的 Cloudflare 节点突然在国内无法访问, 导致包括这个博客在内的所有服务都无法正常使用. 于是我在前段时间在腾讯云买了一台香港的廉价 VPS, 做了一次服务迁移, 包括 在 VPS 上部署 frp, 使用它代替 Cloudflare Tunnel 做内网穿透 把博客搬到 VPS 上, 并使用 Github Action 做自动部署. 域名直接指向 VPS, 不使用 Cloudflare 代理 这篇文章记录我是怎么做的. ...

Read more