查看全文

SIMD 示例

所谓 SIMD 就是一次指令计算多个数据,例如 AVX256 一次计算 256 位数据。

  • int 是 32 位,所以 AVX256 一次计算 8 个
  • double 是 64 位,所以一次计算 4 个

以计算 double 加法为例:

1__m256d m256x; // 定义标识 AVX 寄存器的变量
2__m256d m256y;
查看全文

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 中,添加库目标时,如果不指定库的类型(STATIC,SHARED),则会根据变量 BUILD_SHARED_LIBS 的值来决定库的类型。

BUILD_SHARED_LIBS 为 ON 时默认构建动态库,OFF 时则默认构建静态库。

BUILD_SHARED_LIBS 自身的默认值通常为 ON。

查看全文

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

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

1add_subdirectory(${目录} EXCLUDE_FROM_ALL)
查看全文
查看全文

使用 Docker 配置交叉编译环境

  1. 首先 安装 Docker
  2. 然后下载 ubuntu 作为基础镜像 sudo docker pull ubuntu:20.04
  3. 启动容器 sudo docker run -h aarch64 --name aarch64 -it ubuntu:20.04

最新版 ubuntu 22.04 的 libc6-dev-arm64-cross 为 2.35,与目标平台上的版本 2.28 不兼容,因此使用 20.04 版本的镜像。

安装交叉工具链

查看全文