объекты случайного размера c

#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. Привет, спасибо за ответ, да, это выглядит как лучшее решение, чем использование члена класса и вектора