Код: Выделить всё
struct coordinate{
double x, double y, double z // 3 coordinates for the 3-dimensional case.
}
Сначала я по наивности удалил всю структуру и заменил ее на std::vector, размер которого будет определяться размером d. Однако при тестировании кода доступ к векторным элементам в узких циклах моей симуляции и определение новых векторов оказались намного дороже, чем простая работа со структурами, что меня удивило. По-видимому, это связано с тем, что std::vector распределяет память динамически, в отличие от структур. Более того, если у меня есть двумерный вектор std::vector , где количество строк соответствует количеству частиц, а столбцов - координатам (x,y,z) ( в 3D), кажется, что внутренние векторы не хранятся в памяти рядом друг с другом (в отличие от версии структуры std::vector со структурой выше, где все (x,y, з) всего частицы хранятся последовательно).
Следующая идея заключалась в том, чтобы вместо этого работать с std::array, где я всегда определял массив некоторого максимально допустимого размера MAXDIM > (известно во время компиляции), а затем работать только с элементами массива, заданными размером d, введенным во время выполнения. Для этого я создал новую версию структуры координат:
Код: Выделить всё
constexpr size_t MAXDIM = 3; // Maximum allowed dimension.
class coordinate {
public:
// Default constructor.
coordinate()
: dimension {0} {
coords.fill(0.0); // Initialize all elements to 0.0.
}
coordinate(size_t dim)
{
set_dimension(dim);
coords.fill(0.0);
}
// Method to set the runtime dimension.
void set_dimension(size_t dim) {
if (dim > MAXDIM) {
throw std::out_of_range("Dimension exceeds MAXDIM.");
}
dimension = dim;
}
// Access operator for reading/writing within the runtime dimension.
double& operator[](size_t index) {
return coords[index];
}
const double& operator[](size_t index) const {
return coords[index];
}
private:
std::array coords; // Fixed-size array.
size_t dimension; // Actual dimension.
};
Если бы кто-то работал только с 1D-вазом, я, очевидно, не хранит единую координату в массиве, но я хочу, чтобы мой код работал во всех измерениях без перекомпилирования (поскольку я хочу превратить его в приложение).
Не видя больше кодовой базы, есть ли у кого -нибудь представление о том, правильный ли Chatgpt и как решить эту проблему? Я уже профилировал обе версии кода Perf , но не смог найти примечательные различия (я могу опубликовать результаты PERF, если это необходимо).
Подробнее здесь: https://stackoverflow.com/questions/793 ... variable-c
Мобильная версия