Я «модернизирую» (довольно старый) проект C ++ и спотыкаюсь об этой части:
Старый код выделяет память для массива c Dynami, а затем при необходимости вызываю конструктор для элемента . Я предполагаю, что вызов конструктора для всех элементов обходится дорого, поэтому автор выбрал именно этот способ (производительность критична для этого проекта). Старый код выглядит так (упрощенно):
struct my_struct {
my_struct(int x, int y, int z) { /* expensive ctor */ }
};
struct other_class {
my_struct* arr;
other_class(int n) {
arr = (my_struct*) malloc(n * sizeof(arr[0]);
}
void foo(int idx, int a, int b, int c) {
new (&arr[idx]) my_struct(a, b, c);
}
};
Я изменил arr
на std::vector<my_struct>
и использовал std::reserve
, чтобы «зарезервировать» память. Код работает нормально, прошли все текущие тесты, но я знаю, что это не нормально, поскольку std::reserve
не увеличивает размер этого вектора, поэтому вызов arr.size()
все равно вернет 0. Вот мой код:
struct other_class {
std::vector<my_struct> arr;
other_class(int n) {
arr.reserve(n);
}
void foo(int idx, int a, int b, int c) {
new (&arr[idx]) my_struct(a, b, c);
}
};
Как сделать этот код быстрым и безопасным (при условии, что я не могу добавить ctor по умолчанию в my_struct
)? Спасибо.
Изменить: вот пример кода. Он компилируется и запускается, как ожидалось, без каких-либо предупреждений: http://cpp.sh/8ytwf