我有一个 GUI 应用程序,它使用点云数据和它背后的四叉树数据结构来处理数据。由于我使用的点格式最近发生了变化,我不得不修改我的点类以保存新属性,这导致点对象的大小显着增长,实际上降低了四叉树的性能。其中一些属性对于显示和处理数据是不需要的,但它们仍然需要保留在输出中。这大致是我的点课目前的样子:
class Point {
public:
/* ... */
private:
/* Used data members */
double x;
double y;
double z;
double time;
int attr1;
int attr2;
/* Unused data members */
int atr3;
double atr4;
float atr5;
float atr6;
float atr7;
}
当从文件中加载数据时,Points 存储在 Point* 数组中,然后由四叉树处理。同样,当它们被保存时,从四叉树传递一个点数组并保存到文件中。请注意,我在四叉树中使用的 Point 对象与存储在文件中的对象不同,但我使用的库提供了用于创建点的读取器和写入器对象。这是一个例子:
int PointLoader::load(int n, Point* points) {
Point temp;
int pointCounter = 0;
/* reader object is provided by the library and declared elsewhere */
while (pointCounter < n && reader->read_point()) {
temp = Point(reader->get_x(), reader->get_y(), reader->get_z(), /* ... */ )
points[pointCounter] = temp;
++pointCounter;
}
return pointCounter;
}
现在,我的想法是减小 Point 类的大小,并将未使用的属性存储在硬盘上另一个名为 PointData 的类(或结构)中。这是必要的,因为数据通常不适合内存,并且有一个缓存系统,这将再次受益于较小的点对象。所以给出这个例子,它看起来像这样:
int PointLoader::load(int n, Point* points) {
Point temp;
PointData tempData;
int pointCounter = 0;
while (pointCounter < n && reader->read_point()) {
temp = Point(reader->get_x(), reader->get_y(), reader->get_z(), /* ... */ )
pointData = (reader->get_attr3(), reader->get_attr4(), /* ... */)
temp.dataHandle = /* some kind of handle to the data object */
points[pointCounter] = temp;
/* Save pointData to file to retrieve when saving points */
++pointCounter;
}
return pointCounter;
}
然后,当我保存修改的点时,我只需使用 dataHandle(文件偏移量?内存映射数组中的索引?)来检索每个点的 pointData 并将其写回文件。
这听起来是个好主意吗?实现这一目标的最明智的方法是什么?