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 代码中直接使用:
cppfor (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 |
共享内存引用计数支持 / 核心类型定义。 |