OCCT源码解析(二):NCollection解析

OCCT源码解析(二):NCollection解析

在 OCCT 的底层模块 TKernel 中,NCollection 是整个库的数据基石。虽然现代 C++ 开发首选 STL,但在处理复杂的 CAD 拓扑关系、高效的空间索引以及大规模内存碎片管理时,OCCT 的 NCollection 展现出了其独特的工程价值。

本文将深入 src/NCollection 目录,通过分类解析的方式揭开这套容器库的设计脉络。


架构预览

1. 与 STL/C 容器的映射及迭代机制

OCCT 提供了一套功能完备的容器,其接口格在现代版本中已高度适配 C++ STL 标准。

1.1 容器映射表

NCollection 容器 对应 STL/C 类型 说明
Array1<T> T[N] / std::array 固定大小数组 。支持包装外部指针(零拷贝),不提供 push_back
Vector<T> std::vector<T> 动态数组 。分块分配内存,避免 vector 扩容时的整块搬迁。
List<T> std::list<T> 标准双向链表实现。
Map<T> std::unordered_set<T> 基于哈希表的去重集合。
DataMap<K, T> std::unordered_map<K, T> 键值对哈希映射表。
Sequence<T> std::deque<T> 支持 O(1) 两端操作。

1.2 迭代器与现代 C++ 适配

  • 传统方式 :OCCT 传统的 Iterator 类使用 More()Next()Value() 风格。

  • STL 适配 :通过 NCollection_StlIterator.hxx,OCCT 为大部分容器实现了 begin()end()

  • 技术细节 :这意味着你可以在 OCCT 代码中直接使用:

    cpp 复制代码
    for (const auto& aShape : aSequence) { /* 极简遍历 */ }

2. 内存分配器系统 (Allocators)

2.1 分配器类族全景图

分配器类名 核心特性 典型应用场景
BaseAllocator 虚基类接口 容器持有其指针以实现多态。
IncAllocator 增量分配 建模算法内部。如布尔运算中产生的大量临时拓扑对象。
AccAllocator 累加分配 类似 Inc,但支持在块完全空闲时将其返回系统。
AlignedAllocator 内存对齐 用于 SSE/AVX 数值计算优化。
OccAllocator<T> STL 适配器 std::vector 也能使用 OCCT 内存池。

2.2 内存池设计哲学:双层管理架构

OCCT 采用了 "全局池 + 局部池" 的协作模式:

  • 全局池 (Standard_MMgrOpt):负责小对象的分箱(Bucketing)管理,减少系统调用。
  • 局部池 (IncAllocator) :作为算法独享的 Arena。它从全局池申请大块内存(Blocks),内部通过移动指针实现 O(1) 分配,且无需追踪单个对象的释放。

3. OCCT 特有的"杀手级"容器解析

3.1 索引映射:IndexedMap & IndexedDataMap

  • 内部结构:内部同时持有一个哈希桶数组(用于 O(1) 查找)和一个动态连续数组(用于存储节点指针)。
  • 性能优势 :你可以通过 FindKey(index) 在 O(1) 时间内按顺序找回对象,或通过 FindIndex(key) 查找 ID。
  • 业务场景:拓扑实体(Vertex/Edge/Face)的全局编号管理。

3.2 双向映射:DoubleMap

  • 技术细节 :内部维护了两套哈希映射。每对绑定的 (Key1, Key2) 都会在两个方向上建立映射关系。
  • 业务场景:建立拓扑模型与外部渲染引擎 ID 之间的一一对应。

4. 空间索引树与几何检索

4.1 空间二叉树:NCollection_UBTree

  • 选择器模式 (Selector) :通过实现 Reject(Box)Confirm(Obj) 接口,支持灵活的空间搜索(如射线拾取、碰撞检测)。

4.2 空间哈希格网:NCollection_CellFilter

  • 技术细节:将 n 维空间划分为固定格网,通过格网 ID 进行哈希存储。
  • 业务场景拓扑缝合(Sewing)。在海量点云中极速查找邻近点并合并。

5. 数学向量与矩阵 (Math & Vectors)

  • NCollection_Vec2/3/4: 纯模板向量。
  • NCollection_Mat3/4: 模板矩阵。内存布局与显卡驱动兼容。

6. 宏定义与 Handle 包装 (H-Series)

  • NCollection_DefineHArray1 / HSequence:
  • 本质 :生成继承自 Standard_Transient 的类,使其支持 Handle 引用计数。

7. 总结

分类 类名 (NCollection_*) 功能描述
基础容器 NCollection_Array1 / NCollection_Array2 一维/二维固定大小数组(支持外部内存包装)。
NCollection_List / NCollection_Sequence 双向链表 / 高性能双向序列。
NCollection_Vector / NCollection_DynamicArray 分块动态数组,减少内存重分配。
NCollection_Map / NCollection_DataMap 哈希集合 / 键值对映射表。
NCollection_DoubleMap 双向一对一哈希映射。
NCollection_IndexedMap / NCollection_IndexedDataMap 索引哈希表(支持 Key 查找 ID 和 ID 查找 Key)。
NCollection_SparseArray 稀疏数组,节省极度稀疏数据的内存。
空间算法 NCollection_UBTree / NCollection_EBTree 不平衡/增强型空间二叉树(基于包围盒)。
NCollection_CellFilter n 维空间哈希格网过滤器。
内存管理 NCollection_Allocator / NCollection_BaseAllocator 内存分配器基类与标准接口。
NCollection_IncAllocator / NCollection_AccAllocator 增量分配器 / 累加式分配器(算法核心优化)。
NCollection_AlignedAllocator 内存对齐分配器(SIMD 优化必备)。
NCollection_OccAllocator 用于 STL 容器的 OCCT 内存分配适配器。
NCollection_HeapAllocator / NCollection_WinHeapAllocator 标准堆分配器 / Windows 专用堆分配。
迭代适配 NCollection_Iterator / NCollection_StlIterator 传统迭代器 / STL 兼容迭代器适配。
NCollection_IndexedIterator / NCollection_TListIterator 针对索引容器和链表的专用迭代器。
NCollection_UtfIterator 针对 UTF 字符流的迭代器。
数学向量 NCollection_Vec2 / NCollection_Vec3 / NCollection_Vec4 轻量级模板向量类(GPU 兼容)。
NCollection_Mat3 / NCollection_Mat4 轻量级模板矩阵类。
NCollection_Lerp 线性插值辅助类。
Handle 包装 NCollection_HArray1 / NCollection_HArray2 / NCollection_HSequence 自动生成的堆分配版本容器(支持 Handle)。
NCollection_DefineHArray1 / NCollection_DefineHArray2 / NCollection_DefineHSequence 用于预定义 Handle 容器类的宏。
辅助工具 NCollection_DefaultHasher / NCollection_DefineHasher 默认哈希函数定义宏。
NCollection_String / NCollection_UtfString 平台无关的字符串与编码处理。
NCollection_Buffer / NCollection_LocalArray 内存缓冲区管理与局部自动数组。
NCollection_Primes / NCollection_MapAlgo 质数表 / 映射表通用算法(如联合、交集)。
NCollection_Shared / NCollection_TypeDef 共享内存引用计数支持 / 核心类型定义。
相关推荐
进击的荆棘1 小时前
C++起始之路——C++11(下)
开发语言·c++·c++11·lambda
gumichef1 小时前
栈和队列(2)
数据结构·算法·链表
许长安1 小时前
C++ 原子变量与内存序:从std::atomic到release/acquire
开发语言·数据结构·c++·经验分享·笔记
sanqima1 小时前
mscomm32.ocx串口插件的注册方法
c++·串口通信·ocx插件
进击的荆棘1 小时前
递归、搜索与回溯——综合(下)
c++·算法·leetcode·深度优先·dfs
代码中介商3 小时前
C++ STL 容器完全指南(二):vector 深入与 stringstream 实战
开发语言·c++
澈2078 小时前
C++并查集:高效解决连通性问题
java·c++·算法
郝学胜-神的一滴9 小时前
Qt 入门 01-01:从零基础到商业级客户端实战
开发语言·c++·qt·程序人生·软件构建
宏笋10 小时前
C++ thread的detach()方法详解
c++