【发布时间】:2016-02-09 12:44:33
【问题描述】:
我很难想出一个好的策略来减少以下问题的内存分配:
我正在构建一棵树。一开始,我只有包含一些数据的根(索引列表(std::vector))。我分成两部分,其中一部分索引到左孩子,另一部分到右孩子。我不知道有多少人会去左/右。有一次,我完成了对根的处理,我不再需要为它存储索引。事实上,我只对那些叶子感兴趣。此外,可以在每次拆分时添加其他数据!
所以,如果根有 20 个元素,那么拆分后左边的可能有 12 个元素,右边的有 10 个。
在每个节点中,我保留一个包含这些索引的std::vector。当我添加元素时,我push_back() 导致许多内存分配的元素。
保留索引的好策略是什么?
这个问题与 SBVH 数据结构的生成有关。
代码:
struct Node {
std::vector<unsigned> indices_;
// ... some other stuff here
}
void partition(Node* node) {
Node* left = new Node();
Node* right = new Node();
float axis = findSplitPosition(node);
for(size_t i = 0; i < node->indices_.size(); ++i) {
if (index is strictly left on axis) {
left->indices_.push_back(node->indices_[i]);
} else if(index is strictly right on axis) {
right->indices_.push_back(node->indices_[i]);
} else {
// it intersects the axis -> add to left and right
left->indices_.push_back(node->indices_[i]);
right->indices_.push_back(node->indices_[i]);
}
}
// root indices no longer needed
node->indices_.clear();
}
【问题讨论】:
-
代码可以解释1000多行
-
std::vector<T>::reserve()怎么样? -
您确定分配时间与整体性能相关吗?还是因为树很大而担心(整个程序、进程)内存消耗?
-
它确实发挥了作用。树可能包含数百万个索引。树可能会有点深(它不是平衡树)。像这样分离数据会导致更多的缓存未命中,并且内存分配也会减慢构建速度。如果我正在使用另一种构造算法,它或多或少地完成相同的工作,只是它不执行这么多的分配,它会快 3 倍。
-
@МартинРадев:这应该进入你的问题!
标签: c++ memory-management dynamic-memory-allocation bounding-volume