Tengo una base de código grande, originalmente C portado a C++ hace muchos años, que está funcionando en una serie de grandes conjuntos de datos espaciales. Estas matrices contienen estructuras que representan entidades de punto y triángulo que representan modelos de superficie. Necesito refactorizar el código de modo que la forma específica en que se almacenan estas entidades internamente varíe para escenarios específicos. Por ejemplo, si los puntos se encuentran en una cuadrícula plana regular, no es necesario que guarde las coordenadas X e Y, ya que se pueden calcular sobre la marcha, al igual que los triángulos. Del mismo modo, quiero aprovechar las herramientas básicas como STXXL para el almacenamiento. La forma más sencilla de hacerlo es reemplazar el acceso a la matriz con funciones de tipo poner y recibir, p. Ej.¿Puedo usar el operador [] en C++ para crear matrices virtuales
point[i].x = XV;
convierte
Point p = GetPoint(i);
p.x = XV;
PutPoint(i,p);
Como se puede imaginar, este es un refactor muy tedioso en una gran base de código, propenso a todo tipo de errores en el camino. Lo que me gustaría hacer es escribir una clase que imite la matriz al sobrecargar al operador []. Como las matrices ya viven en el montón, y se mueven alrededor con reallocs, el código ya asume que las referencias en la matriz tales como
point *p = point + i;
no pueden ser utilizados. ¿Es esta clase factible de escribir? Por ejemplo, escribir los métodos a continuación en términos del operador [];
void MyClass::PutPoint(int Index, Point p)
{
if (m_StorageStrategy == RegularGrid)
{
int xoffs,yoffs;
ComputeGridFromIndex(Index,xoffs,yoffs);
StoreGridPoint(xoffs,yoffs,p.z);
} else
m_PointArray[Index] = p;
}
}
Point MyClass::GetPoint(int Index)
{
if (m_StorageStrategy == RegularGrid)
{
int xoffs,yoffs;
ComputeGridFromIndex(Index,xoffs,yoffs);
return GetGridPoint(xoffs,yoffs); // GetGridPoint returns Point
} else
return m_PointArray[Index];
}
}
Mi preocupación es que todas las clases de matriz que he visto tienden a pasar por referencia, mientras que yo creo que tenga que pasar estructuras por valor. Creo que debería funcionar algo más que el rendimiento, ¿alguien puede ver las trampas más importantes con este enfoque. nótese bien. La razón por la que tengo que pasar por valor es obtener
point[a].z = point[b].z + point[c].z
para que funcione correctamente donde varía el tipo de almacenamiento subyacente.
Devolver una referencia al punto implica tener múltiples puntos únicos para todas las referencias potencialmente activas que están activas al mismo tiempo. Esto requerirá un caché de datos transformados, pero debería ser viable. Gracias por la respuesta. –
uso de WRT de una estrategia de almacenamiento en lugar de OO o plantillas, no funcionaría ya que el código existente no está escrito para soportarlo, y un requisito principal es minimizar la cantidad de reescritura. Quiero incluir algo que es polimórfico en tiempo de ejecución en la parte posterior, pero en la parte delantera imita una matriz en C. Si lo escribo desde cero, las plantillas son indudablemente el camino a seguir. –