Tôi có một cơ sở mã lớn, ban đầu C được chuyển đến C++ nhiều năm trước, hoạt động trên một số mảng lớn dữ liệu không gian. Các mảng này chứa các cấu trúc biểu diễn các thực thể điểm và tam giác đại diện cho các mô hình bề mặt. Tôi cần phải cấu trúc lại mã như vậy theo cách cụ thể mà các thực thể này được lưu trữ nội bộ khác nhau cho các tình huống cụ thể. Ví dụ, nếu các điểm nằm trên một lưới phẳng thông thường, tôi không cần phải lưu trữ các tọa độ X và Y, vì chúng có thể được tính toán trên bay, như các hình tam giác. Tương tự, tôi muốn tận dụng lợi thế của các công cụ cốt lõi như STXXL để lưu trữ. Cách đơn giản nhất để thực hiện việc này là thay thế truy cập mảng bằng các hàm kiểu put và get, ví dụ:Tôi có thể sử dụng toán tử [] trong C++ để tạo mảng ảo
point[i].x = XV;
trở thành
Point p = GetPoint(i);
p.x = XV;
PutPoint(i,p);
Như bạn có thể tưởng tượng, đây là một cấu trúc lại rất tẻ nhạt trên một cơ sở mã lớn, dễ bị tất cả các loại lỗi trên đường. Những gì tôi muốn làm là viết một lớp bắt chước mảng bằng cách nạp chồng toán tử []. Khi các mảng đã tồn tại trên heap và di chuyển xung quanh với reallocs, mã đã giả định rằng tham chiếu vào mảng chẳng hạn như
point *p = point + i;
không được sử dụng. Lớp này có khả thi để viết không? Ví dụ, viết các phương thức dưới đây về toán tử [];
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];
}
}
Mối quan tâm của tôi là tất cả các lớp mảng tôi đã xem có xu hướng chuyển qua tham chiếu, trong khi tôi nghĩ tôi phải chuyển cấu trúc theo giá trị. Tôi nghĩ rằng nó nên làm việc đặt khác hơn là hiệu suất, bất cứ ai có thể nhìn thấy bất kỳ cạm bẫy lớn với cách tiếp cận này. n.b. lý do tôi phải chuyển qua giá trị là để có được
point[a].z = point[b].z + point[c].z
để hoạt động chính xác nơi loại lưu trữ cơ bản thay đổi.
Trả lại tham chiếu đến điểm ngụ ý có nhiều điểm duy nhất cho tất cả các tham chiếu có khả năng hoạt động cùng một lúc. Điều này sẽ yêu cầu một bộ nhớ cache của dữ liệu chuyển đổi, nhưng phải được hoàn toàn khả thi. Cảm ơn câu trả lời. –
WRT sử dụng chiến lược lưu trữ thay vì OO hoặc mẫu, nó sẽ không hoạt động vì mã hiện tại không được viết để hỗ trợ nó và yêu cầu chính là giảm thiểu số lượng viết lại. Tôi muốn thả vào một cái gì đó là chạy đa thời gian ở cuối phía sau, nhưng ở mặt trước bắt chước một mảng C. Nếu tôi đã viết nó từ đầu, mẫu chắc chắn là con đường để đi. –