#c #object #random
#c #объект #Случайный
Вопрос:
Я пытался выполнить упражнение по программированию, которое включает в себя выделение 10000 объектов случайных размеров в диапазоне [1000: 0)-байт с использованием new, цель состоит в том, чтобы определить, сколько времени требуется new для выделения объектов и сколько времени требуется delete для их освобождения. Мне было интересно, какой наилучший способ получить объекты случайных размеров? Я подумал об одном методе, но я не уверен, что он правильный:
// Object of varying size
class Object {
public:
Object(int num_bytes) { vc.resize(num_bytes); }
vector<char> vc; // char is 1 byte
};
int n = 10000; // number of Objects to allocate
vector<Object*> pointers;
for (int i = 0; i < n; i)
{
int size = randint(1, 1000); // random number between 1 and 1000
Object* p = new Object(size);
pointers.push_back(p); // keep pointers to Objects in vector so
// can later deallocate
}
Комментарии:
1. Это зависит от вашего использования слова
object
— разве массиваchar
s недостаточно?2. Все экземпляры
Object
будут иметь одинаковый размер.std::vector
выделяет его память с помощью отдельного выделения.3. A
char
действительно является «байтом» в стандартном C . Проблема в том, что в стандартном C «байт» действительно имеет длину не менее 8 бит. Не гарантируется, что это будет 8 бит (может быть больше).4. Привет, спасибо за ваши ответы, так будет ли использование массива символов случайного размера, выделенного с использованием новой работы?
5. @FredLarson: Все в порядке;
Object
уничтожение довольно тривиально. То, что вы действительно здесь делаете, — это сравнительно точное время уничтожения самих векторов, лишь слегка косвенно.
Ответ №1:
Просто скажите «нет» необработанным циклам и необработанным указателям, которые владеют ресурсами (живут в coliru):
const int n = 10000; // number of Objects to allocate
std::mt19937 engine{std::random_device{}()};
std::uniform_int_distribution<std::size_t> dist(1, 1000);
std::vector<std::unique_ptr<char[]>> pointers;
pointers.reserve(n);
std::generate_n(std::back_inserter(pointers), n, [amp;]{
return std::unique_ptr<char[]>(new char [dist(engine)]);
});
Ответ №2:
for (int i = 0; i < n; i)
{
int size = randint(1, 1000); // random number between 1 and 1000
char* p = new char[size];
pointers.push_back(p);
}
Я думаю, что этот код сделает то, что вам нужно.
Комментарии:
1. Изменение размера вектора увеличит только внутренние буферы для вектора, а не выделенную память для «Объекта»
Ответ №3:
Самый простой способ — выделение массивов символов:
char *obj = new char[numberOfBytes];
Комментарии:
1. Привет, спасибо за ответ, да, это выглядит как лучшее решение, чем использование члена класса и вектора