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

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

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

Студворк — интернет-сервис помощи студентам
Можно ли скажем так выделить память под массив классов с участием конструктора с параметрами для каждого элемента этого массива в цикле без потери времени
я думал сначала по конструктору по умолчанию а потом вызывать для каждого.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2017, 12:34
Ответы с готовыми решениями:

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

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

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

46
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.11.2017, 14:19
Студворк — интернет-сервис помощи студентам
Deczy, значит вам нужен именно placment new
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.11.2017, 14:20
Deczy, неправильно. Если вы хотите динамически создать массив указателей, то так пишите

C++
1
Group** group = new Group*[gsize];
0
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 101
27.11.2017, 14:23  [ТС]
Зачем мне мавссив указаителей
эээм
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.11.2017, 14:23
Цитата Сообщение от Deczy Посмотреть сообщение
Group* group = new Group[gsize];
group[i] = new Group(gname, gsize, student);
Не по вашему заданию:
C++
1
2
Group** group = new Group *[gsize];
group[i] = new Group(gname, gsize, student);
По вашему заданию:
C++
1
2
Group* group = static_cast<Group *>(new char[sizeof(Group)*gsize]);
new (group+i) Group(gname, gsize, student);
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.11.2017, 14:28
Deczy, чтобы обращаться к созданному массиву и чтобы потом уничтожить все объекты класса.

Можно ли скажем так выделить память под массив классов
В данном случае вы создаете не массив классов, а массив указателей на классы. Это нужно для того, чтобы не сработал конструктор с умолчанием, если бы вы делали массив объектов класса.

без потери времени
Потеря времени будет, если инициализировать массив с конструктором по умолчанию, а потом забивать ваши параметры через set-методы.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.11.2017, 14:33
Кстати с массивом указателей можно создавать полиморфные классы (т.е. чтобы указатель указывал на дочерний класс, содержащий больше полей чем родительский). В случае же placment new нужно использовать классы строго одинакового размера, иначе они начнут затирать друг друга.
0
0 / 0 / 0
Регистрация: 16.02.2016
Сообщений: 101
27.11.2017, 14:36  [ТС]
О боже моя не внимательность и торопливость
Теперь все ясно)

Добавлено через 49 секунд
Спасибо за ваше терпение
0
77 / 50 / 16
Регистрация: 17.05.2015
Сообщений: 262
27.11.2017, 15:28
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Group *group[10]; group[i] = new Group(gname, gsize, student);
Мне одному кажется, что данный подход крайне не оптимален? Зачем вообще делать массив, если ты все равно объекты выделяешь в куче, как попало.
А так можно за ранее создать массив. А уже у каждого обьекта вызвать конструктор
C++
1
2
3
4
Group objects[100];
 
for (int i = 0; i < 100; ++i)
    new(objects+i) Group(gname, gsize, student);
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.11.2017, 15:32
Valeryn,

C++
1
Group objects[100];
Эта запись создает объекты и вызывает конструктор по умолчанию.
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
27.11.2017, 15:33
C++
1
2
3
4
T* items = new T[N];
 
size_t index = ...;
T* object = new(items + index) T();
Может, Вам надо вот это?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.11.2017, 15:40
Цитата Сообщение от Valeryn Посмотреть сообщение
А так можно за ранее создать массив
если сделать так, то конструкторы у 100 объектов Group таки вызовутся именно в объявлении
C++
1
Group objects[100];
Чтобы они не вызывались, нужно выделять память под стандартные типы:

C++
1
2
char objects_mem[sizeof(Group)*100];
Group *objects = static_cast<Group *>(objects_mem);
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.11.2017, 15:40
New man, по-моему это содержит как минимум две ошибки. Приведите рабочий пример.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.11.2017, 15:44
Цитата Сообщение от New man Посмотреть сообщение
T* items = new T[N];
здесь тоже будут вызваны конструкторы по-умолчанию.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.11.2017, 16:24
TRam_, у меня заработало только так

C++
1
2
3
char objects_mem[sizeof(MyClass) * 10];
 
MyClass *m = reinterpret_cast<MyClass *>(objects_mem);
Или так

C++
1
2
3
char *objects_mem = new char[sizeof(MyClass) * 10];
 
MyClass *m = reinterpret_cast<MyClass *>(objects_mem);
1
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.11.2017, 16:28
Цитата Сообщение от Deczy Посмотреть сообщение
Можно ли скажем так выделить память под массив классов с участием конструктора с параметрами для каждого элемента этого массива в цикле без потери времени
Чем не устраивает vector reserve + emplace_back в цикле?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.11.2017, 16:41
avgoor, тоже вариант. Но он С++11.

Добавлено через 1 минуту
Цитата Сообщение от QuakerRUS Посмотреть сообщение
у меня заработало только так
да, действительно нужен именно reinterpret_cast<>.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.11.2017, 16:46
Цитата Сообщение от TRam_ Посмотреть сообщение
тоже вариант. Но он С++11
Да, очень новый стандарт. всего лишь семь лет назад вышел. Почти вчера...

Но посмотреть, как там это реализовано ничего не мешает. Кроме того вы забыли про такую вещь, как выравнивание, что может выйти боком.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
27.11.2017, 16:48
avgoor, выравнивание учитывается в вычислении sizeof() , ровно точно так же как и при адресной арифметике. Так что не вижу в чём оно может "выйти боком".
0
27.11.2017, 16:49

Не по теме:

Я вообще книжку 98го года по С++ дочитываю. :)

0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.11.2017, 17:15
Цитата Сообщение от TRam_ Посмотреть сообщение
выравнивание учитывается в вычислении sizeof()
Где?
object_mem может выделиться по нечетному адресу, что при наличии в классе double члена обеспечит в лучшем случае тормоза.

Добавлено через 13 минут
UPD соврал. Для массива char в третьем стандарте есть требование по выравниванию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.11.2017, 17:15

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru