提问人:BENG 提问时间:8/29/2023 更新时间:8/29/2023 访问量:110
为此任务分配内存的最快方法
Fastest way to allocate memory for this task
问:
我正在开发 C++/OpenGL 3D 网格建模软件。基本上是一个非常原始的搅拌机。
A 包含顶点缓存(下面的类),其顶点数据存储在单个块中以发送到 glBufferData。这就是下面的向量。然后,与每个顶点相关联的是边索引和面索引的动态数组,这些索引引用包含该顶点的边和面的 ID。Mesh
EditCache<Vertex>
vertices
template<typename T>
class EditCache {
private:
std::vector<T> vertices;
std::vector<std::vector<int>> edge_indices;
std::vector<std::vector<int>> face_indices;
public:
int addVertex(T vertex) {
vertices.push_back(vertex);
edge_indices.push_back(std::vector<int>());
face_indices.push_back(std::vector<int>());
return vertices.size() - 1;
}
void pairEdgeIndex(int vertex_index, int edge_index) {
edge_indices[point_index].push_back(edge_index);
}
void pairFaceIndex(int vertex_index, int face_index) {
face_indices[point_index].push_back(face_index);
}
...
};
当在现有顶点的类中创建新的边或面时,新边/面的 ID 将推送回与边/面中的每个顶点关联的数组。当创建一个新顶点时,它被推回数组,并在新顶点的位置推回两个新的空向量,以保存包含新顶点的边和面列表。Mesh
edge_indices
face_indices
vertices
数据结构大致如下所示(而不是它在内存中的存储方式)。
- vertex_0 | { edge_0, ..., edge_n } | { face_0, ..., face_m }
- vertex_1 | { edge_0, ..., edge_n } | { face_0, ..., face_m }
- vertex_2 | { edge_0, ..., edge_n } | { face_0, ..., face_m }
- ...
其中,每个边或面列表的长度是可变的。在内存中,每列(顶点、边索引和面索引)是三个独立的数组。
在创建新的四边形、面或具有许多新顶点的更大结构时,我必须多次执行以创建新顶点,并将每个顶点与其每个新边和面配对。而且一个一个地分配内存真的很慢。我认为我有优化空间的问题是:std::vector.push_back()
1.) 边缘和面 ID 的数组不必是连续的,它们可以是链表。
2.) 我会知道在任务开始时我将添加多少点。
因此,在理想情况下,我会分配一个我需要的大小块,然后将每个数据点一个接一个地附加到新空间中的每个链表中。如何完成此任务?当然,我不喜欢公开和操作,也不喜欢将原始指针暴露给自由空间。有没有办法用 or 来做到这一点?如何以安全的方式分配内存?new
delete
std::unique_ptr
std::shared_ptr
答:
因此,在理想情况下,我会分配一个我需要的大小块,然后将每个数据点一个接一个地附加到新空间中的每个链表中。如何完成此任务?
当您知道需要多少空间时,可以预先为向量保留空间:
std::vector<int> x;
x.reserve(100000);
// then later
x.push_back(42); // no allocation happens here
坦率地说,我认为你的其他问题只是因为预期事情比实际情况更复杂而引发的。您不需要手动,也不需要智能指针,矢量可以做到这一点(而且它不是不安全的)。new
delete
评论
std::vector::push_back
push_back
push_back
reserve
resize
reserve