从一段 Android 源码说开去

总结 在成员函数内声明的 static 变量,其生命周期依旧是整个程序,与类对象的数量、构造和销毁无关; 对一般函数及静态成员函数而言,函数名等同于函数指针;而对非静态成员函数而言,上述不成立; 构造 std::thread 的背后是 std::invoke() 一、成员函数中的 static 变量 这些天在工作中接触到了这样一段 Android 源码(可通过此处 查看): 1// android-10.0.0_r30, frameworks/native/libs/gui/Surface.cpp 2class FenceMonitor { 3public: 4 explicit FenceMonitor(const char* …

【前缀+Hash】与【双指针】的区别

注:双指针法俗称“滑动窗口”,但我不喜欢这个名称,因为这给人感觉是一个固定长度的窗口在(数组上)滑动,而实际上该方法中的“窗口”长度不是固定的,更像个手风琴或弹簧。 例题 前缀+Hash:560. 和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 1输入:nums = [1,1,1], k = 2 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 题解: 1class Solution { 2public: 3 int subarraySum(vector<int>& nums, int k) { 4 …

差分数列

概念 数列 $a$,$b$ 满足以下条件: $$ \begin{align*} b_1 &= a_1\\ b_2 &= a_2 - a_1\\ &\vdots\\ b_n &= a_n - a_{n-1} \end{align*} $$ 故有: $$ \begin{align*} a_1 &= b_1\\ a_2 &= b_1 + b_2\\ &\vdots\\ a_n &= b_1 + b_2 + \cdots + b_n \end{align*} $$ 其中称 $b$ 为 $a$ 的差分(Difference Array),$a$ 为 $b$ 的前缀和(Prefix Sum Array)。两者为一组逆运算。 用法 差分数列的一个 …

Using Pbuilder to (Cross-)Build Debian Packages

One day I wanted to build a program for a 64-bit ARM OS with basic dpkg support. Since its binaries for x86 and the corresponding source code had been adapted and maintained as Debian packages by several distros, an easy way for me would be to grab the source code of one package, cross-build it for ARM 64 architecture, …

C++ 中的 Name Mangling

关于 C++ Name Mangling 的故事,还要从 C 语言说起。 C 语言的场景 在 C 语言中,一个函数的函数名唯一标识这个函数。换另外两个表述: 不同函数的界定与区分只看函数名,与返回值、入参类型和个数等因素皆无关; 出现多个相同函数名的函数定义意味着重定义错误。 1void foo() { } 2void foo(int a) { } // error: redefinition of ‘foo’ 3int foo() { } // error: conflicting types for ‘foo’ C 语言的这种对函数的处理比较原始,但也有好处。这里涉及到一个背景知识:C/C++ 源代码经过编译器编译后,编译器会用 …