深入解析:Async++ 源码分析2---aligned_alloc.h

news/2025/10/17 13:49:31/文章来源:https://www.cnblogs.com/yxysuanfa/p/19147653

一、Async++ 代码目录结构

Async++ 项目的目录结构清晰,主要包含根目录下的配置文件、源代码目录、头文件目录以及示例代码目录,具体结构如下:

asyncplusplus/
├── .gitignore               # Git 忽略文件配置
├── Async++Config.cmake.in   # CMake 配置模板文件
├── CMakeLists.txt           # CMake 构建脚本
├── LICENSE                  # 许可证文件(MIT 许可证)
├── README.md                # 项目说明文档
├── examples/                # 示例代码目录
│   └── gtk_scheduler.cpp    # GTK 调度器示例
├── src/                     # 源代码目录
│   ├── fifo_queue.h         # FIFO 队列实现
│   ├── internal.h           # 内部头文件(包含类型定义、宏等)
│   ├── scheduler.cpp        # 调度器实现
│   ├── singleton.h          # 单例模式实现
│   ├── task_wait_event.h    # 任务等待事件实现
│   ├── threadpool_scheduler.cpp  # 线程池调度器实现
│   └── work_steal_queue.h   # 工作窃取队列实现
└── include/                 # 头文件目录├── async++.h            # 主头文件(对外提供统一接口)└── async++/             # 子模块头文件目录├── aligned_alloc.h├── cancel.h├── continuation_vector.h├── parallel_for.h├── parallel_invoke.h├── parallel_reduce.h├── partitioner.h    # 分区器相关定义├── range.h          # 范围(迭代器对)相关定义├── ref_count.h├── scheduler.h      # 调度器接口定义├── scheduler_fwd.h├── task.h           # 任务类定义├── task_base.h      # 任务基类定义├── traits.h└── when_all_any.h

二、aligned_alloc.h源码分析

2.1 源码

// Copyright (c) 2015 Amanieu d'Antras
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
namespace async {
namespace detail {
// Allocate an aligned block of memory
LIBASYNC_EXPORT void* aligned_alloc(std::size_t size, std::size_t align);
// Free an aligned block of memory
LIBASYNC_EXPORT void aligned_free(void* addr) LIBASYNC_NOEXCEPT;
// Class representing an aligned array and its length
template::value>
class aligned_array {std::size_t length;T* ptr;
public:aligned_array(): length(0), ptr(nullptr) {}aligned_array(std::nullptr_t): length(0), ptr(nullptr) {}explicit aligned_array(std::size_t length_): length(length_){ptr = static_cast(aligned_alloc(length * sizeof(T), Align));std::size_t i;LIBASYNC_TRY {for (i = 0; i < length; i++)new(ptr + i) T;} LIBASYNC_CATCH(...) {for (std::size_t j = 0; j < i; j++)ptr[i].~T();aligned_free(ptr);LIBASYNC_RETHROW();}}aligned_array(aligned_array&& other) LIBASYNC_NOEXCEPT: length(other.length), ptr(other.ptr){other.ptr = nullptr;other.length = 0;}aligned_array& operator=(aligned_array&& other) LIBASYNC_NOEXCEPT{aligned_array(std::move(*this));std::swap(ptr, other.ptr);std::swap(length, other.length);return *this;}aligned_array& operator=(std::nullptr_t){return *this = aligned_array();}~aligned_array(){for (std::size_t i = 0; i < length; i++)ptr[i].~T();aligned_free(ptr);}T& operator[](std::size_t i) const{return ptr[i];}std::size_t size() const{return length;}T* get() const{return ptr;}explicit operator bool() const{return ptr != nullptr;}
};
} // namespace detail
} // namespace async

2.2 核心功能:内存对齐工具

内存对齐在并发编程中很重要(例如避免缓存行冲突、适配特定硬件指令等),这段代码提供了基础的对齐内存管理能力。

(1)aligned_alloc 和 aligned_free
  • aligned_alloc:分配一块指定大小(size)和对齐要求(align)的内存块,返回 void 指针。LIBASYNC_EXPORT 宏表明该函数是导出的(供框架内部其他模块使用)。
  • aligned_free:释放由 aligned_alloc 分配的内存块,LIBASYNC_NOEXCEPT 表明该函数不会抛出异常。

这两个函数是底层内存管理接口,封装了平台相关的对齐内存分配逻辑(例如可能基于 posix_memalign 或 Windows 的 _aligned_malloc 实现)。

(2)模板类 aligned_array

一个封装了 “对齐数组” 的 RAII 类,用于管理指定类型 T 的数组,且数组内存满足指定对齐要求(默认是 T 类型的自然对齐值 std::alignment_of<T>::value)。

核心成员
  • length:数组元素数量。
  • ptr:指向对齐内存的 T* 指针。
关键方法解析
  • 构造函数

    • 默认构造函数:初始化空数组(length=0ptr=nullptr)。
    • 带长度的构造函数:通过 aligned_alloc 分配内存,并在分配的内存上逐个调用 T 的构造函数(placement new)。若构造过程中抛出异常,会自动销毁已构造的元素并释放内存(异常安全)。
    • 移动构造函数:转移数组所有权(避免深拷贝,提高效率)。
  • 赋值运算符

    • 移动赋值:通过交换指针和长度实现资源转移,旧资源会被临时对象的析构函数自动释放。
    • 赋值 nullptr:重置为为空数组。
  • 析构函数

    • 逐个调用数组元素的析构函数(~T()),然后通过 aligned_free 释放底层内存,确保资源不泄漏。
  • 其他接口

    • operator[]:访问数组元素(类似普通数组)。
    • size():返回元素数量。
    • get():返回底层指针。
    • 显式转换为 bool:判断数组是否非空。

2.3 设计亮点

  • 异常安全:在构造数组时,若元素构造抛出异常,会自动回滚(销毁已构造元素 + 释放内存),符合 RAII 设计原则。
  • 移动语义:通过移动构造和移动赋值,避免了大数组的深拷贝,提升性能。
  • 模板灵活性:可指定元素类型 T 和对齐要求 Align,适应不同场景(例如需要 64 字节对齐以匹配缓存行的场景)。

2.4. 用途

该类主要用于框架内部需要对齐内存的场景,例如:

  • 管理并发数据结构(如工作窃取队列)的内部数组,避免因内存未对齐导致的性能损耗。
  • 存储需要特定对齐的类型(如 SIMD 指令相关的数据)。

通过封装对齐内存的分配、构造、析构和释放逻辑,简化了安全管理对齐数组的代码,减少了内存泄漏或异常安全问题的风险。

三、核心用法示例

3.1. 包含头文件

需包含定义该类的头文件(通常是框架内部的 aligned_alloc.h):

#include "async++.h"
3.2. 创建对齐数组
// 创建一个包含 10 个 int 元素的数组,默认对齐(int 的自然对齐,通常 4 字节)
async::detail::aligned_array arr1(10);
// 创建一个包含 5 个 double 元素的数组,强制 64 字节对齐(适合缓存行优化)
async::detail::aligned_array arr2(5);
  • 构造时会自动分配对齐内存,并为每个元素调用默认构造函数(T())。
  • 若 T 没有默认构造函数,需确保构造时能正确初始化(例如 T 有其他构造函数时,可能需要配合额外逻辑)。
3.3. 访问数组元素

通过 operator[] 或 get() 指针访问:

// 访问 arr1 的第 3 个元素(索引从 0 开始)
arr1[2] = 42;
std::cout << arr1[2] << std::endl; // 输出 42
// 通过 get() 获取底层指针,进行迭代
double* ptr = arr2.get();
for (size_t i = 0; i < arr2.size(); ++i) {ptr[i] = i * 1.5;
}
3.4. 移动语义(避免拷贝开销)

aligned_array 禁用了拷贝构造和拷贝赋值(未显式定义,且移动操作会转移资源),仅支持移动,适合高效传递数组所有权:

// 移动构造:arr3 接管 arr1 的资源,arr1 变为空
async::detail::aligned_array arr3(std::move(arr1));
// 移动赋值:arr4 接管 arr3 的资源,arr3 变为空
async::detail::aligned_array arr4;
arr4 = std::move(arr3);
3.5. 重置数组(释放资源)

通过赋值 nullptr 或析构函数自动释放资源:

// 手动重置:释放内存,元素析构
arr4 = nullptr;
// 超出作用域时,析构函数自动调用,释放资源
{async::detail::aligned_array temp(5);
} // temp 析构,内存释放
3.6. 检查数组是否有效

通过显式 bool 转换判断数组是否非空:

if (arr2) { // 等价于 arr2.get() != nullptrstd::cout << "arr2 包含 " << arr2.size() << " 个元素" << std::endl;
}

四、适用场景

由于 aligned_array 保证了内存对齐,主要用于:

  1. 高性能并发数据结构:例如工作窃取队列(work_steal_queue),避免因内存未对齐导致的 CPU 缓存冲突。
  2. 底层内存管理:需要严格对齐的场景(如 SIMD 指令、硬件特定要求等)。
  3. 异常安全的数组管理:自动处理构造 / 析构过程中的异常,避免资源泄漏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/938871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux sas3ircu RAID 控制管理工具详解

Linux sas3ircu RAID 控制管理工具详解sas3ircu 是一款用于管理 LSI SAS3008 等系列 RAID 控制卡的强大命令行工具。它允许你在操作系统中直接配置RAID、查看磁盘信息、定位故障硬盘等,无需重启服务器进入BIOS设置。 …

Linux StorCLI RAID 控制管理工具详解

Linux StorCLI RAID 控制管理工具详解StorCLI 是管理 Broadcom(原LSI)MegaRAID 系列硬件 RAID 控制器的强大命令行工具,适合在缺乏图形界面的环境中进行精细的存储配置和监控 。 下面为您梳理其下载安装、核心用法和…

2025年浓缩机厂家权威推荐榜:高效浓缩机/尾矿浓缩机/污泥浓缩机/新型浓缩机/矿用浓缩机/浓密机/中心转动浓缩机/真空浓缩机/污泥脱水机

2025年浓缩机厂家权威推荐榜:高效浓缩机/尾矿浓缩机/污泥浓缩机/新型浓缩机/矿用浓缩机/浓密机/中心转动浓缩机/真空浓缩机/污泥脱水机行业背景与发展趋势在当今的工业处理领域,浓缩设备作为固液分离工艺中的关键环节…

新手学AI算法/嵌入式 “知其然不知其所以然”?华清远见虚拟仿真工具拆分算法组件 + 动态调参,过程感拉满

后台私信,备注“AI/嵌入式体验”,免费领取对应体验课试听及平台试用 前阵子看到俞敏洪讲AI的直播,他说 “AI 能写新疆旅行的文案,但写不出我骑在马背上看夕阳时的心跳”、“能整理课程大纲,却替代不了我和学生面对…

http1.0,http2.0,http3.0各个协议的特点和区别

好的,当然可以。以下是 HTTP/1.0、HTTP/2.0 和 HTTP/3.0 的详细中文说明,包括它们各自的特点和核心区别。 一张图看懂演进历程特性 HTTP/1.0 HTTP/2.0 HTTP/3.0核心模型 每个请求一个TCP连接 单一TCP连接,多路复用 …

Clip Studio Paint 4.0.3下载地址与安装教程

软件介绍 Clip Studio Paint 4.0.3是由CELSYS公司开发的专业数字绘画软件,分为PRO版与EX版,支持Windows、macOS、iOS及Android多平台运行。该版本搭载TRIGLAV绘画引擎,提供逼真的铅笔、画笔笔触模拟,并优化64位系统…

​​示波器探头的正确选择与使用指南​

本文系统介绍了示波器探头的选择、类型及使用规范,强调信号类型识别、探头匹配及安全操作的重要性。在电子电路测试中,示波器探头作为连接被测电路与示波器的关键部件,其正确选择和使用方法直接影响测量结果的准确性…

C# Avalonia 16- Animation- KeySplineAnimation

C# Avalonia 16- Animation- KeySplineAnimationKeySplineAnimation.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:…

2025年工厂维保服务厂家权威推荐榜:机电维修、应急维修、设备安装维修、运维服务全方位解析

2025年工厂维保服务厂家权威推荐榜:机电维修、应急维修、设备安装维修、运维服务全方位解析行业背景与发展趋势随着制造业数字化转型的深入推进,工厂维保服务行业正经历着深刻变革。现代工厂设备日益复杂,智能化程度…

SQL 多表查询实用技巧:ON 和 WHERE 的区别速览 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

windows 11 或 Windows 10 注册表修改企业版为专业版

Windows 11 或 Windows 10 版本标识修改指南( qwen 指导版) 本文档详细介绍了如何修改Windows 11/10 的版本标识信息,包括ProductName、EditionID和CompositionEditionID等注册表键值。 概述 此方法仅修改注册表中的…

低代码平台核心概念与设计理念

低代码平台核心概念与设计理念 1. 低代码平台概述 1.1 定义和特性 低代码平台(Low-Code Development Platform, LCDP)是一种通过可视化建模与配置,最小化手写代码量,从而快速构建和交付应用程序的软件开发平台。其…

PyTorch nn.Linear 终极详解:从零理解线性层的一切(含可视化+完整代码) - 指南

PyTorch nn.Linear 终极详解:从零理解线性层的一切(含可视化+完整代码) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

C# Avalonia 16- Animation- ExpandElement2

C# Avalonia 16- Animation- ExpandElement2ExpandElement2.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="…

2025年10月洗碗机品牌榜单推荐:五强性能全解析

在选择洗碗机品牌时,关键在于找到最适合自身实际需求的解决方案。中国家电协会2024年发布的《家用洗碗机行业服务标准白皮书》显示,国内洗碗机保有量已突破2200万台,年复合增长率保持在18%左右;其中,一级保管等级…

PolarDB Supabase 助力 Qoder、Cursor、Bolt.diy 完成 VibeCoding 最后一公里

引言:在“摩擦力”中追寻心流 Vibecoding——是每一位开发者都在追寻的理想境界:一种思想与代码完全同步、创造力毫无阻碍的沉浸式“心流”状态。然而,在日常工作中会常被各种“摩擦力”无情打断:繁琐的后端配置、…

问题一

问题一模型蓝方航迹离散为序列 ({(t_i,\mathbf{r}i,\mathbf{v}i)}^{N-1})(1 s 采样),(\mathbf{r}i=(x_i,y_i,z_i)),(\mathbf{v}i=(v,v,v));trajectory.py 中 TrajectoryPoint 对象承载这些数据。 红方 A 型雷达集…

2025年陶瓷过滤机厂家权威推荐榜:盘式/矿用/全自动陶瓷真空过滤机,真空脱水机,尾矿干排设备,圆盘过滤机源头企业深度解析

2025年陶瓷过滤机厂家权威推荐榜:盘式/矿用/全自动陶瓷真空过滤机,真空脱水机,尾矿干排设备,圆盘过滤机源头企业深度解析行业背景与发展趋势随着现代工业对固液分离技术要求的不断提高,陶瓷过滤机作为高效节能的分…

00-第一个C语言程序-Hello,world

一、第一个学习的C语言程序点击查看代码 #include <stdio.h> int main() {printf("hello, world\n");return 0; }![image](https://img2024.cnblogs.com/blog/3625321/202510/3625321-202510171318569…

提取ai字幕

提取B站视频AI字幕方法 先关闭AI字幕,然后再进入控制里面的网络 之后再打开AI字幕,拉拉进度条,让字幕显示出来之后在过滤器里面输入过滤词"ai_subtitle",之后会出现两个点开开头不是web的一行,里面的响应…