Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.99/70: Рейтинг темы: голосов - 70, средняя оценка - 4.99
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549

Когда выделять память

08.10.2020, 18:18. Показов 15649. Ответов 201

Студворк — интернет-сервис помощи студентам
вот завис в моём понимании этот пункт:
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
в случае динамического выделения памяти. Без которого ты вряд ли сделаешь что-то полезное.
в той же ветке - были даны пояснения
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В стеке ты не можешь свободно создавать/удалять объекты. Только добавлять в голову и удалять оттуда же. В куче же ты можешь это делать в любой последовательности.
...
когда выделять поток - в принципе поняла,
когда выделять класс - в принципе поняла (чтобы разорвать зависимости)
КОГДА выделять память?.. - всё-таки ещё не всегда очень хочется её выделять, чтобы потом удалять... но даже не в этом суть... а смысл первой цитаты?
поделитесь please опытом кто-нибудь - когда вы выбираете создать объект на стеке, а когда вы выбираете создать объект в куче?. - какие есть предпосылки для вашего выбора?
не хочу потом всё переделывать - а мне всё равно кажется, что на стеке всегда быстрее, а когда и почему лучше куча не знаю... а то ведь могу написать что попало...
логично, что на стеке - определена последрвательность, но ведь при обращении к разным объектам проблем вроде не бывает... имхо... и понятно, что через стек идут параметры функций - так что получается, всё остальное, т.е. вообще всё лучше располагать в куче?
какую проблему можно получить, если всё располагать на стеке? и в каком случае вообще app не запуститься при таком подходе (есть ли такая опасность)?.. есть ли какие-то критерии "must do"? и никак иначе
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2020, 18:18
Ответы с готовыми решениями:

Как лучше выделять память: динамичски или в стэке?
Я раньше всегда думал, что в стеке происходит более быстрое выделение, но сейчас нашел в интернете одну статью, где было написано: ...

Можно ли через список инициализации выделять память в куче
Можно через список инициализации выделять память в куче?

Как динамически выделять память на один элемент массива?
Вот программа: int main() { int n,a,b; Item *mas; cout << "Enter amount of coordinates" << endl; cin >>...

201
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.10.2020, 12:07
Студворк — интернет-сервис помощи студентам
https://www.coursera.org/lectu... -new-jSggV - тут есть немного про это.
1
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.10.2020, 12:33
Цитата Сообщение от Avazart Посмотреть сообщение
Там видимо не про обычный new а про placement new на стеке.
Там про "обычный" new.
На "стеке" мы и так можем начиная с С++11 выровнять память как нам надо с использованием alignas.
А вот "обычный" new всегда возвращает дефолтно-выровненную память. И повлиять на это выравнивание непосредственно было нельзя.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.10.2020, 12:35
Тогда да не совсем понятно зачем это нужно.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.10.2020, 12:39
Avazart, чтобы выровнять динамическую память для работы с SSE, например. При этом стандартными средствами.

Добавлено через 2 минуты
Или для того, чтобы выровнять по единичке динамический буфер, который заведомо будет использоваться в качестве хранилища "сырых" байт. До этого стандартный new все равно делал (мог делать) стандартное выравнивание. В итоге кусочек байт, в количестве от 4 до 16 (в зависимости от) уходил на выравнивание, которое никому не нужно.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
13.10.2020, 12:51  [ТС]
Вобщем, действительно, - -

Иногда вам нужно реализовать класс, управляющий ресурсом... В большинстве случаев вам не нужно самостоятельно управлять ресурсом, потому что существующий класс, такой как std::string, уже делает это за вас. Пока вы держитесь подальше от сырых указателей, правило трех вряд ли относится к вашему собственному коду.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.10.2020, 13:21
Но это слишком для начинающих.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
13.10.2020, 13:55  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
это слишком для начинающих.
а я и в "сырых" ещё начинающая - и даже начинать пока не хочется, раз есть c++ - пока его осилю...
Цитата Сообщение от DrOffset Посмотреть сообщение
Или для того, чтобы выровнять по единичке динамический буфер, который заведомо будет использоваться в качестве хранилища "сырых" байт.
сырые байты - это, наверно, ещё страшнее, чем сырые указатели... хорошо, что хотя бы в STD всё спрятано в либы... а то управление ресурсами для меня превратилось бы в очень нетривиальную задачку... имхо
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.10.2020, 13:59
Цитата Сообщение от JeyCi Посмотреть сообщение
сырые байты - это, наверно, ещё страшнее, чем сырые указатели...
Вот пакет из сети вы получили, или файл открыли и функцией read прочитали - это сырые байты. Т.е. байты, с которыми не ассоциировано никаких типов. С такими байтами работают как с массивом байт, соответственно никакое специальное выравнивание для них не требуется. Т.е. достаточно выравнивания по байтовой границе.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
13.10.2020, 14:20  [ТС]
всё-таки потоки потоками, а в оперативку (т.е. кучу) вмещаться хочется нормально, а не съедать её всю... за пояснения по "сырым" спасибо, но hand-made allocator я пока точно делать не буду... вектор Фреймворка или array (reading from txt) меня устраивает
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
13.10.2020, 14:21
Цитата Сообщение от JeyCi Посмотреть сообщение
но hand-made allocator я пока точно делать не буду
Хм, а кто-то предлагал вам это делать?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
13.10.2020, 15:06  [ТС]
ну я же не всегда верю "на-слово" - мне показалось...
=========
просто думаю... вот распараллеливаем, например, задачу - а память ведь может забиться до отказа? - при том что потоки ещё будут стоять в очередь на ядро (да ещё со всем захваченным, получается многократно, контекстом - если потоков много)... не рационально, вероятно, получается...
= это в случае, если каждый поток выделять на куче...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.10.2020, 15:14
Цитата Сообщение от JeyCi Посмотреть сообщение
= это в случае, если каждый поток выделять на куче...
Для каждого потока резервируется память под стек. В Windows, по-умолчанию, это 1Мб.
Но забить память до отказа ты можешь и без потоков. От них это совершенно не зависит.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
13.10.2020, 15:23  [ТС]
просто подумала, что на куче под 100 потоков резервируется памяти в 100 раз больше, чем под один поток...
если их создавать на куче...
хотя если функции для них на стеке - то согласна - проблема, вероятно, надуманая...
спасибо
(что будет твориться в этих функциях важнее для такой проблемы - главное в самой функции много мусора не плодить и аккуратненько данные ворочать на куче из этих функций)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.10.2020, 17:22
Цитата Сообщение от JeyCi Посмотреть сообщение
просто подумала, что на куче под 100 потоков резервируется памяти в 100 раз больше, чем под один поток...
Под любые 100 объектов потребуется в сто раз больше памяти, чем под один. Там линейная зависимость. Потоки не исключение.

Добавлено через 1 минуту
Цитата Сообщение от JeyCi Посмотреть сообщение
хотя если функции для них на стеке - то согласна - проблема, вероятно, надуманая...
Нет, не надуманная. Потоки требуют дофига памяти под стек
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.10.2020, 17:24
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Для каждого потока резервируется память под стек. В Windows, по-умолчанию, это 1Мб.
JeyCi, Т.е. 1000 потоков это уже как минимум 1 Гб, и на машине где оперативки мало/загружена - может быть печалька.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
13.10.2020, 19:34  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
и на машине где оперативки мало
ну 1мб стэка CPU и 1гб RAM - это вообще в разных концах света (т.е. материнской платы) - некорректно сравнивать...

Не по теме:

а печалька была - когда RAM забивается до отказа и комп падает (понимаю, что оперативка, помню, что AutoCAD, верю, что графики много в нём - просто не знаю внесли ли ещё какие его потоки вклад в это)

0
фрилансер
 Аватар для Алексей1153
6496 / 5727 / 1133
Регистрация: 11.10.2019
Сообщений: 15,289
13.10.2020, 19:53
Цитата Сообщение от JeyCi Посмотреть сообщение
ну 1мб стэка CPU и 1гб RAM - это вообще в разных концах света (т.е. материнской платы)
так-то стек тоже в ОЗУ сидит. Насколько я знаю
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
13.10.2020, 20:03  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
тоже в ОЗУ сидит
класс С++ - да,
а CPU - это процессор, у него тоже есть стэк (он маленький и быстрый - 1мб), через который гоняются функции и их аргументы... и, вероятно, объекты расположенные на стэке - всегда так думала - в этом суть ветки - когда это добрО переносить на кучу - в RAM - которая медленнее... (в начале ветки - уже вроде разобрались)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.10.2020, 20:07
Цитата Сообщение от JeyCi Посмотреть сообщение
а CPU - это процессор, у него тоже есть стэк (он маленький и быстрый - 1мб), через который гоняются функции и их аргументы... и, вероятно, объекты расположенные на стэке - всегда так думала - в этом суть ветки - когда это добрО переносить на кучу - в RAM - которая медленнее... (в начале ветки - уже вроде разобрались)
Нет, ты, наверное, перепутала кэш с стеком.
У потока есть стек, у процессора - кэш
0
13.10.2020, 20:16

Не по теме:

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
у процессора - кэш
Или точнее сказать кешИ (разных уровней).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.10.2020, 20:16

Подскажите пожалуйста, правильно выделять память под lua состояние
Подскажите пожалуйста, правильно выделять память под lua состояние. Выполнение кода не возвращает 0. Сам код не мой, его ...

Нужно ли под массив выделять память функциями malloc или new?
собственно вот программа по вводу размера массива, вводу массива, сортировки: #include <iostream> #include <windows.h> ...

Можно ли, используя make_shared<T> выделять память под массивы, по аналогии с функцией make_unique<T>?
Интересует следующий вопрос. Можно ли, используя данную функцию выделять память под массивы, по аналогии с функцией make_unique&lt;T&gt;....

Функция: подсчет количества слов во введенной строке (под строку выделять динамическую память)
Доброго времени суток! Осваиваю С++, возникла проблема с написанием программы. По заданию необходимо написать функцию, подсчитывающую...

Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?
Интересует данный вопрос. Можно ли и имеет ли вобще смысл например выделять память под объект класса с помощью функций calloc, malloc или...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru