CMake 项目构建和代码测试
前言
CMake 是非常常见的 C++ 代码构建工具,在 C++ 项目构建中被广泛使用。
本文我们将以著名的 CMake 入门示例 Useful CMake Examples - Github 为例,进行 CMake 的使用汇总。
快速开始
链接示例
这个示例中包含 CMake 配置文件的基本结构,同时包含头文件、静态库、动态库的链接方式。
最后,我们还在这个示例中包含了安装的示例,尽管这并不常用。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667# 定义项目名和最小支持版本cmake_minimum_required(VERSION 3.5)project(hello_binary)############################################################# 配置###################################### ...
梳理事务中的锁
事务中的锁一直是数据库中非常重要的部分,其中 MySQL 的 InnoDB 就包含意向锁 / 记录锁 / 间隙锁等,本文将以此展开事务的背后锁是如何运作的。
C++ 正则表达式 regex 的使用
前言
正则表达式(regular expression / regex)是非常实用的工具,几乎在所有语言中,都包含对正则表达式的支持,它们的语法大同小异。今天我们来讲讲 C++ 中 regex 的使用。另外需要注意的是,正则表达式不是专属于 C++ 的,在本文中我们假设你已经熟悉正则表达式。
本文需要正则表达式的前置芝士。
快速开始
一个简单的匹配
在正则表达式中,表达式的匹配分为编译和匹配两个部分。在 regex 库中,必须首先编译模式串,然后和字符串匹配。需要注意的是,在 C++ 中,编译和匹配两个操作必须是分离的,而在一些其他语言中可能支持直接匹配的接口(例如 Python,初学者通常选择直接编译)。
因此在 C++ 中,使用正则表达式必须分为两个步骤:
构造 regex 对象,即前面提到的编译。
使用 regex_match / regex_search 匹配。或者使用其他方法匹配。
123456789101112131415161718192021222324252627#include <iostream>#include <regex>us ...
面经 - 字节跳动 广告基础架构实习生 一面挂 240223
时间线
流程概况
240221 牛客简历初筛
…挺快,几个小时后就收到了面试邀约。
240223 一面口头过
主要聊了 C++,写了两道题。最后出了点问题,但在最后改对了(还是太紧张了),但还是给我过了。差强人意吧。
240304 感谢信
一面口头过了,但估计还因为大二以及实习只有两个月,以及面试表现不算特别突出,最后正式挂了。
一面
面试过程
首先是相互介绍,面试官先介绍了它们部门的业务,然后我介绍了一下我的技能项。
问题
解答情况
(面试官自我介绍,我的自我介绍)
什么时候开始打 ACM?高中有没有代码基础?
balabala,如实回答。
LRU-K 是啥?我知道 LRU,你给我大概讲讲 LRU-K。(面试官读简历中…)
balabala,面试官应该是真不知道。
Copy-on-Write 又是什么东西?(面试官读简历中…)
balabala,面试官应该是真不知道。
(后面开始问 C++)
总结下 static 这个关键字。
函数中的 static,类中的 static,总之可以扩大生命周期。
追问: static 成员函数是否可以访问普 ...
面经 - 达坦科技 Python开发实习生 一面挂 240220
这是第一次面试,自我安慰为,面得不好是意料之中吧。
岗位背景
达坦科技,北京小公司,线上实习。找 Rust 分布式存储开发,应该是缺人,牛客私聊我有 Python 线上实习。
个人简历主 C++,也涉及一半 Python 内容。
面试过程
首先是本来以为面试官会要求打开屏幕共享,结果面试官全程不露脸,也不要求屏幕共享,我开了摄像头也没开。
整个流程非常快,当天 HR 微信联系。
下午和 HR 聊了分布式和 Rust,我说我都不懂,HR 提供了意见:MIT6.824、Rust 官方教程。总体感觉 HR 很友好(但个人并没有 Rust 发展计划,我只能嗯嗯嗯好好好)。
晚上 CTO 约面(下文称面试官),约了第二天下午。整个微信联系过程都很礼貌,面试过程也很礼貌,不过给我挂了,当然聊得过程中也感觉到会被挂了。
面试官只问了一个问题,CMU15445。和我聊整个项目的实现和中间拓展的问题,估计面试官对数据库还是比较拿手,它说他还有很多关于数据库的拓展问题,但我没办法继续回答下去。其中主要问题如下:
问题
解答情况
大概介绍简历上两个项目。
Python 项目是 Python ...
从引用折叠到 move 与 forward 代码复现
前言
C++ 中的引用折叠十分晦涩难懂,而 move 与 forward 正是基于引用折叠,且难以理解。本文将从引用折叠讲起,理解为什么需要引用折叠、什么是引用折叠、引用折叠在模板中的作用,最后复现 move 与 forward。
本文需要右值引用、移动语义、模板的前置芝士。
引用折叠
什么是引用折叠
为什么需要引用折叠引用折叠用于保障一些 C++ 功能的正常工作,而它正是 std::move 的基础。事实上,我们之前学习的所有右值引用和移动语义的相关芝士,都需要通过 std::move 的协助。如果没有引用折叠,则 std::move 将无法实现,那么所有的右值引用都没有意义,引用折叠可以看作是编译器最初为实现右值引用做出的妥协。
在正常编程中,我们实际上极少接触引用折叠,因为它几乎仅仅被 std::move 与 std::forward 应用。不过在模板编程中,引用折叠又被赋予了其新的意义 。当然,如果你并不熟悉引用折叠,这些意义可能意味着新的 “坑”。
引用折叠是多次定义引用后的类型推导方式。但引用折叠禁止被显示定义,它事实上只在 using 或模板场景中才会出现,例如下 ...
一文理解类的访问权限
在类的继承体系中,关于访问权限我个人感觉一直是非常复杂,各类博客、书籍对它的解释都不够好。在这篇文章我想通过我的理解,着重解释类的继承体系中复杂的访问权限的原理。
using 的三大作用汇总
本文将整理总结 using 的两个 "引入"、一个 "别名" 用法:using namespace `namespace` / using `namespace`::`member` / using `alias` = `typename`,以及 using 在类中被赋予的特殊意义。
模板元 - 三种条件编译汇总
前言
今天我们来谈谈条件编译。条件编译是非常有意思和方便的东西,它类似于函数重载,对于不同的类型使用不同的算法。这是传统的一个函数重载的示例,我们姑且将它算作条件编译:
12345678910int to_int(int i) { return i; }int to_int(double f) { return f; }int to_int(const char *s) { return atoi(s); }int to_int(const std::string &s) { return std::stoi(s); }int to_int(const std::vector<char> &v) { int ret = 0; for (char x : v) ret = ret << 8 | static_cast<unsigned int>(ret); return ret;}
但是,这种传统的条件编译 ...
类的六个特殊成员函数的自动合成
前言
类的六个特殊成员函数具体是:
123456789class A { public: A() = default; // 默认构造函数 A(const A &) = default; // 拷贝构造函数 A &operator=(const A &) = default; // 拷贝赋值函数 A(A &&) noexcept = default; // 移动构造函数 A &operator=(A &&) noexcept = default; // 移动赋值函数 ~A() noexcept = default; // 析构函数};
当我们未显式定义这六个函数时,编译器默认会自动合成,但当它们的其中一些被显式定义或删除时,它们的其中一些不会被生成。这一直是一个非常头疼的点,因为它们之间的关系可以说非常复杂。本文就将介绍这些函数在何时合成,以及应对之法。
开始前的一个小芝士 - 如何自己做实验这里我们还是问出了一个经典的问题,如何进行实验?基于实验我们 ...