通过 #include 将文件加载为字符串字面量的技巧

C23 新增的 #embed 预处理指令可以实现相同的功能。
资源文件通常使用 xxd -i <file> 来生成数组。

  • C++:
1#include <iostream>
2#include <string>

C++ 函数消抖

函数消抖 指在短时间内连续多次调用同一函数,仅最后一次调用生效。

形如:

1auto debouncedFn = debounce(fn, 100);

通常将需要消抖的函数封装成一个新的函数,新的函数进行延迟后调用原函数:

C++ 容器内元素重复析构的问题

说明

std::vector 这种连续空间的容器,当空间不足时需要整体重新分配内存,并将旧的数据迁移过去。 首先会使用 std::move_if_noexcept 尝试进行移动。 因此如果元素类型的移动构造函数没有标明 noexcept 则不会被调用。 之后会通过 std::uninitialized_copy 尝试进行拷贝。

这是因为移动中如果产生异常,部分源数据已经被移动,将无法恢复原状。而拷贝中如果发生异常,源数据不应改变,只要返回失败即可。

在 enum class 中使用 bitmask 组合的方法

可以通过重载 | 运算符实现 bitmask 组合,例如:

1enum class SystemNamespaceType
2{
3    MOUNT   = CLONE_NEWNS,      // Mount Namespace
4    UTS     = CLONE_NEWUTS,     // UNIX Time-Sharing Namespace
5    IPC     = CLONE_NEWIPC,     // Inter-Process Communication Namespace

CMake 子目录依赖处理

最近开发的一个项目依赖 libgeotiff,同时 libgeotiff 又依赖 libtiff,我将他们都加入 thirdparty 中,通过 add_subdirectory 添加进项目中。

  • thirdparty
    • CMakeLists.txt
    • libgeotiff
    • libtiff
1undefined

CMake 库的默认类型与不支持动态库警告

构建库的默认类

在 CMake 中,添加库目标时,如果不指定库的类型(STATICSHARED),则会根据变量 BUILD_SHARED_LIBS 的值来决定库的类型。

BUILD_SHARED_LIBSON 时默认构建动态库,OFF 时则默认构建静态库。

BUILD_SHARED_LIBS 自身的默认值通常为 ON

CMake 忽略第三方库的安装指令

通过 CMake 在项目中包含第三方库的源码时,如果直接包含,install 的时候会同时安装第三方库。如果不想安装第三方库,可以添加 EXCLUDE_FROM_ALL

1add_subdirectory(${目录} EXCLUDE_FROM_ALL)

MySQL 全文索引

全文索引是一种对文本进行全文搜索的索引,类似搜索引擎的反向索引,可以大幅提升全文搜索的速度。但同时也会对插入性能造成较大影响。

创建全文索引

创建表时创建全文索引:

1undefined

MySQL 数据库初始化

创建用户

首先通过root进行免密登录:

1sudo mysql

MySQL 数据库基础命令

本文中尖括号 <> 表示占位符,方括号 [] 表示可选,而圆括号 () 则是 MySQL 语法的一部分。

数据库的操作命令

1-- 创建数据库
2CREATE DATABASE <数据库名>;