Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 101
1

Выделить память под массив классов заранее

27.11.2017, 12:34. Показов 4658. Ответов 46
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Можно ли скажем так выделить память под массив классов с участием конструктора с параметрами для каждого элемента этого массива в цикле без потери времени
я думал сначала по конструктору по умолчанию а потом вызывать для каждого.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2017, 12:34
Ответы с готовыми решениями:

Динамически выделить память под массив
Добрый день форусчани Как можно выделить память под массив объекта класса class Save_Colection {...

Динамически выделить память под массив
Задание было в следующем: дан вещественный двумерный массив А. Поменять местами максимальный...

Выделить память под массив размера 2^64 байтов
Требуется выделить память под массив размера 2^64 байтов. Как порекомендуете решать данную задачу?

Динамически выделить память под массив функций
QByteArray (SerfingThread::*lp_GetRequest)(const QByteArray& ,const QByteArray&); как сделать тоже...

46
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
29.11.2017, 10:22 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Эта запись создает объекты и вызывает конструктор по умолчанию.
ну можно malloc|calloc|или new char[size]. Суть уловили я думаю?)
0
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
29.11.2017, 10:25 42
Valeryn, не уловил. Показывайте рабочий вариант.
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
30.11.2017, 13:06 43
Цитата Сообщение от Valeryn Посмотреть сообщение
ну можно malloc|calloc|или new char[size]. Суть уловили я думаю?)
C++
1
2
3
4
Object *objects = (Object*)malloc(sizeof(Object) * 10);
for (int i = 0; i < 10; ++i) {
    new(objects + i) Object(args...);
}
C++
1
2
3
4
Object *objects = (Object *)(new char[sizeof(Object) * 10]);
for (int i = 0; i < 10; ++i) {
    new(objects + i) Object(args...);
}
Любым способом выделяем память а потом уже вызывает конструктор оператором new(void*) T(Args...).
1
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
30.11.2017, 13:09 44
А в конце не забываем вызвать все деструкторы и сделать удаление преобразованного в исходный тип массива
C++
1
2
3
4
for (int i = 0; i < 10; ++i) {
    objects[i].~objects();
}
delete[] ((char *)objects);
Хотя вместо си-шного приведения можно воспользоваться reinterpret_cast<>
0
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
30.11.2017, 15:19 45
Valeryn, способ рабочий, подобный способу TRam_

Однако не думаю, что он лучше, чем обычное использование массивов указателей.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
30.11.2017, 15:28 46
QuakerRUS, разве что вызов одного new будет быстрее, чем вызов N раз new. Но не знаю случаев, когда бы приходилось удалять/создавать массивы объектов настолько часто, что частоту вызовов new приходилось бы учитывать.
0
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
01.12.2017, 11:52 47
TRam_, для бОльших объемов мой алгоритм работает быстрее (по крайней мере у меня). Например, если с класса убрать динамический массив и значительно уменьшить N, ваши алгоритмы будут быстрее. Так же, если скомпилировать на x64 архитектуре, мой алгоритм работает еще быстрее. Проверял на VS2017.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <time.h>
 
using namespace std;
 
class MyClass
{
public:
    MyClass(int d)
        : data(d)
    {
        ptr = new int[100];
    }
    ~MyClass()
    {
        delete[] ptr;
    }
 
private:
    int data;
    int* ptr;
};
 
const int N = 1000;
int timeStamp, counter;
 
void quaker()
{
    counter = 0;
 
    while (timeStamp == time(NULL))
    {
        MyClass **m = new MyClass* [N];
 
        for (int i = 0; i < 10; i++)
            m[i] = new MyClass(i);
 
        for (int i = 0; i < 10; i++)
            delete m[i];
 
        delete[] m;
        counter++;
    }
 
    cout << "quaker: " << counter << endl;
}
 
void tram_()
{
    counter = 0;
 
    while (timeStamp == time(NULL))
    {
        char *objects_mem = new char[sizeof(MyClass) * N];
 
        MyClass *m = reinterpret_cast<MyClass *>(objects_mem);
 
        for (int i = 0; i < N; ++i)
            new(m + i) MyClass(i);
 
        for (int i = 0; i < N; ++i)
            m[i].~MyClass();
 
        delete[] reinterpret_cast<char *>(m);
        counter++;
    }
 
    cout << "tram_: " << counter << endl;
}
 
void valeryn()
{
    counter = 0;
 
    while (timeStamp == time(NULL))
    {
        MyClass *m = (MyClass *)(new char[sizeof(MyClass) * N]);
 
        for (int i = 0; i < N; ++i)
            new(m + i) MyClass(i);
        
        for (int i = 0; i < N; ++i)
            m[i].~MyClass();
 
        delete[] (char *)m;
        counter++;
    }
 
    cout << "valeryn: " << counter << endl;
}
 
int main()
{
    while (1)
    {
        timeStamp = time(NULL);
        while (timeStamp == time(NULL));
        timeStamp = time(NULL);
        quaker();
 
        timeStamp = time(NULL);
        while (timeStamp == time(NULL));
        timeStamp = time(NULL);
        tram_();
 
        timeStamp = time(NULL);
        while (timeStamp == time(NULL));
        timeStamp = time(NULL);
        valeryn();
    }
 
    system("pause");
    return 0;
}
Добавлено через 18 часов 54 минуты
TRam_, пардон, в моем алгоритме закралась досадная ошибка. Ваши алгоритмы работают значительно быстрее.
0
01.12.2017, 11:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2017, 11:52
Помогаю со студенческими работами здесь

Выделить память под массив неизвестной длины
для программы нужен массив int Array т.е. длину строки я знаю, а сколько строк у меня будет...

Выделить память под динамический массив указателей
Нужно выделить память вот под такое дело. Для примера n=5 . Ничего нагуглить так и не смог :( что...

Выделить и удалить память под 4 мерный массив
пацаны помогите.. Добавлено через 1 час 11 минут .помогите..не могу вобще натйи 4 мерные...

Как выделить память под массив в структуре?
Здравствуйте , воnрос конечно глуnый , но голову я сижу ломаю долго , есть Структура , в ней есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru