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

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

08.10.2020, 18:18. Показов 15689. Ответов 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
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.11.2020, 13:49
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от JeyCi Посмотреть сообщение
а вот как не потерять custom_deleter, оформленный указателем на функцию в shared_ptr - чего не знаю, того не знаю пока... ?
Там ты его никак не потеряешь.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.11.2020, 13:59
Цитата Сообщение от JeyCi Посмотреть сообщение
Unless you need to be able to change the deleter at runtime, I would strongly recommend using a custom deleter type. For example, if use a function pointer for your deleter, sizeof(unique_ptr<T, fptr>) == 2 * sizeof(T*). In other words, half of the bytes of the unique_ptr object are wasted.
Тут написано о том, что при использовании указателя на функцию в качестве Deleter`а приведет к тому, что половина размера вашего unique_ptr будет использована под хранение этого указателя на функцию. Ни о какой "потере" тут речь не идет. И я бы не назвал это неприятностями. Просто это нерационально и все.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.11.2020, 14:04  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
в Ultimate++ не получится создавать элементы управления динамически?
я не думаю, что это запрет на использование контейнеров STD в U++ и управлять ими соответствующе... хотя догма U++ "всё завёрнуто в wrappers, что избавляет от беспокойств о памяти" мне импонирует... может, действительно, в std то и не особо завёрнуто всё, а я перепутала с upp... хотя миксовать namespases - не очень comme il faut, мне кажется...
спасибо, что навели резкость в моём сопротивлении использовать динамическую память!
===
Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Ни о какой "потере" тут речь не идет.
Цитата Сообщение от DrOffset Посмотреть сообщение
half of the bytes of the unique_ptr object are wasted.
а мне подумалось то, что выделила...
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
01.11.2020, 14:07
Цитата Сообщение от JeyCi Посмотреть сообщение
а мне подумалось то, что выделила...
Я так и подумал. Поэтому написал. Но это дословный перевод. Тут имеется в виду, что память будет потрачена впустую (естественно - это образно говоря, потому что указатель хранится же не просто так, он нужен для вызова в деструкторе).
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.11.2020, 14:24
Цитата Сообщение от JeyCi Посмотреть сообщение
я не думаю, что это запрет на использование контейнеров STD в U++ и управлять ими соответствующе... хотя догма U++ "всё завёрнуто в wrappers, что избавляет от беспокойств о памяти" мне импонирует... может, действительно, в std то и не особо завёрнуто всё, а я перепутала с upp... хотя миксовать namespases - не очень comme il faut, мне кажется...
спасибо, что навели резкость в моём сопротивлении использовать динамическую память!
Я имел ввиду взять и создать по нажатию кнопки пользователем заданное им количество к примеру кнопок.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.11.2020, 14:28
Цитата Сообщение от JeyCi Посмотреть сообщение
вот вы и ответили на ваше непонимание, зачем мне это пока сильно не надо
JeyCi, название топика и головной пост вопроса не содержат информации о том, что вам нужно и для чего вы думаете выделять или не выделять.
Цитата Сообщение от JeyCi Посмотреть сообщение
когда вы выбираете создать объект на стеке, а когда вы выбираете создать объект в куче?. - какие есть предпосылки для вашего выбора?
не имеет отношения к контейнерам ни STL ни вариантам co-STL типа NTL. Дело даже не в том что co-STL - не всегда, прям уж, ко-эстэыль. А в том, что они выделяют в куче, а не на стеке и не могут присутствовать в аргументации поставленного в теме вопроса.
То есть, дело не в том, что ваши реквайрменты к инвайрменту слабы. У вас проблемы с инвайрсментом самих реквайрментов.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.11.2020, 14:41  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Я имел ввиду взять и создать по нажатию кнопки пользователем заданное им количество к примеру кнопок.
тут не только в кнопках дело, а в том, что сами контейнеры ими позиционируются, как NTL в противовес STD-контейнерам...
да и сами указатели у них зашиты... но запрета на использование указателя и динамическое выделение памяти вроде нет - пример new*vec и пример на наследование и ещё полиморфизм тех же контролов - они сами уже наследуют от Ctrl - у которого есть виртуальный деструктор...
поэтому, если например вектор контролов запихнуть в One, который выполняя функции unique_ptr также расширен для того, чтобы быть контейнером (судя по их докам) - то должен сработать по логике этот виртуальный деструктор при выходе из scope'a... имхо
вобщем, надо просто не сопротивляться этой их догме, а воспользоваться имеющимися классами...
p.s.
как и в STD:
от класса можно наследовать, если в нём заложен виртуальный деструктор... но таких вроде немного в std, не знаю есть ли
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.11.2020, 14:46
От контейнером STL можно наследоваться, никто не запрещает НО всегда стоит брать в расчет что у них нет виртуального деструктора.

Добавлено через 58 секунд
Цитата Сообщение от JeyCi Посмотреть сообщение
тут не только в кнопках дело, а в том, что сами контейнеры ими позиционируются, как NTL в противовес STD-контейнерам...
Дело в том что как тут без дин. выделения памяти если кол-во не известно заранее?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.11.2020, 16:44  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
как тут без дин. выделения памяти если кол-во не известно заранее?
я в их библиотеку не лазила, но, наверно, Add и Add - может сам плюсует size?... ведь сами пишут вариант (по лнку выше)
C++
1
2
Vector<Value> *vec = new Vector<Value>();
 vec->Add(...);
Добавлено через 1 час 43 минуты
здесь
Q: I am getting compiler errors such as: function 'void *operator new(size_t)' already has a body
A: U++ implements its own heap for performance reasons. It should work fine unless your code tries to overload new/delete too
так что, Avazart, я думаю вы правильно мне напомнили об этом нюансе (NTL) U++...
Цитата Сообщение от Avazart Посмотреть сообщение
Дело в том что как тут без дин. выделения памяти если кол-во не известно заранее?
в общем, логично циклом через arrA.Add(new B);, взяв введённое куда-либо число ... - пример отсюда - в том числе о нормальном наследовании...
чисто динамически вряд ли - всё надо оборачивать/оборачивается в свои обёртки, имеющиеся в U++... имхо
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.11.2020, 19:26
Цитата Сообщение от JeyCi Посмотреть сообщение
U++ implements its own heap for performance reasons.
Вам как бе и в STL-контейнерах никто не мешает навелосипедить собственный аллокатор. Причем, без проблем с перегрузкой operator new. Нужно ли это делать - вопрос другой. Кто вам сказал что перформанс вашего велосипеда обязательно будет лучше стандартного варианта? И, кстати говоря, какой ценой будет достигнут выигрыш в скорости? К примеру, buddy allocation гарантировано работает за логарифмическое время, но практически гарантировано выбрасывает этак половину памяти на ветер. Алгоритм выделяет память только степенями двойки и крутитесь как хотите.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.11.2020, 19:52
Цитата Сообщение от JeyCi Посмотреть сообщение
мне напомнили об этом нюансе (NTL)
Кстати что за NTL ?
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.11.2020, 20:06  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
что за NTL ?
Overview of U++ containers - NTL
NTL - STL Comparison
NTL and standard library
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.11.2020, 20:32
NTL was created to solve following problems we used to encounter when using STL:

Copy-constructible requirements

STL requires the elements stored in containers to meet the requirements of copy-constructible and assignable types. This causes two problems:

Elements that do not satisfy these requirements cannot be directly stored in STL containers.

For many types of elements, including STL containers themselves, copy-constructor and assign operator is a very expensive operation, that is why often they cannot be stored in STL containers effectively.

NTL addresses this problem by introducing Vector and Array flavors of containers.
Ну это все вроде давно устарело.

В Qt к примеру тоже свои контейнеры есть, которые как бы были призваны решать проблему с копированиями.
0
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.11.2020, 20:35  [ТС]
NTL (Non standard Template Library) - containers library - U++ Technologies
Unlike STL, which has single copy-constructible and assignable requirement for whole library, NTL makes requirements on per container and even per method basis. This way NTL allows direct storing of any type of elements.
... сравнение скорости NTL и STD (выигрыш 1-го), также примеры Qt и U++ кода - тоже есть на их сайте...
выбор - лишь вопрос предпочтений и личного комфорта
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.11.2020, 20:39
Цитата Сообщение от JeyCi Посмотреть сообщение
Overview of U++ containers - NTL
"Each single NTL container template that can store more than one element has random access".
Хм... И как вы представляете себе реализацию random access применительно к содержимому map? Ну, то есть, понятно как - формальная поддержка конструкций вида iterator[100500], при фактическом линейном поиске элемента по индексу. Только что-то это попахивает намеренным введением в заблуждение, путем значимых умолчаний.
1
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
01.11.2020, 20:44  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
И как вы представляете себе реализацию random access применительно к содержимому map?
мне не надо их представлять - это уж точно не моя задача... а задача разработчиков этого фреймворка
Цитата Сообщение от Renji Посмотреть сообщение
Ну, то есть, понятно как - формальная поддержка конструкций вида iterator[100500]
странно, что вы представляете то, с чем, видимо, даже не знакомились...
ваши вопросы лучше адресуйте разработчикам, не мне... я не представляю, а пользуюсь удобствами, выполняю свои задачи.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.11.2020, 20:53
Ну с Qt я видел сравнение, довольно надуманно и притянуто.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.11.2020, 20:58
Цитата Сообщение от JeyCi Посмотреть сообщение
мне не надо их представлять - это уж точно не моя задача... а задача разработчиков этого фреймворка
Надо, надо. Также как механику надо представлять как работает двигатель автомобиля. И что на одной капле бензина можно проехать сто километров только под гору, если тормоза отказали.
Цитата Сообщение от JeyCi Посмотреть сообщение
странно, что вы представляете то, с чем, видимо, даже не знакомились...
О, я то как раз знакомился и с алгоритмами по которым работают эти контейнеры, и требованиями к random access iterator. Реализовать доступ по индексу за константное время можно ровно в одном случае - если элементы/указатели на них будут лежать в непрерывном массиве. Но при использовании такого массива, у вас добавление элементов в контейнер будет иметь линейную сложность. С другой стороны, формально в требованиях к random access iterator и не написано что там не может быть линейной сложности доступа. А то что для нормальных людей линейная сложность - антоним random access, это уже мелочи жизни эффективного менеджера.

UPD А нет, вру - на cppreference.com для LegacyRandomAccessIterator таки заявлена константная сложность инкремента. Так что даже трюк с "мы же обещали только поддержку квадратных скобок" не прокатит.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.11.2020, 23:17
Цитата Сообщение от Renji Посмотреть сообщение
И как вы представляете себе реализацию random access применительно к содержимому map?
Цитата Сообщение от на-на
Упала мапа,
-Упала на пол!
И ветром мапу,
-Мапу унесло)
Цитата Сообщение от Renji Посмотреть сообщение
А то что для нормальных людей линейная сложность - антоним random access, это уже мелочи жизни эффективного менеджера.
UPD А нет, вру - на cppreference.com для LegacyRandomAccessIterator таки заявлена константная сложность инкремента. Так что даже трюк с "мы же обещали только поддержку квадратных скобок" не прокатит.
Ну мы же все знаем что и доступ константен! Вот этого раpве мало:
Цитата Сообщение от http://www.cplusplus.com/reference/iterator/RandomAccessIterator/
Random-access iterators are iterators that can be used to access elements at an arbitrary offset position relative to the element they point to, offering the same functionality as pointers.

Random-access iterators are the most complete iterators in terms of functionality. All pointer types are also valid random-access iterators.
?
Оно конечно скромно и непрямо, но сказано, тем не менее, - лицом чёрен и прекрасен!
Аки указатель, то есть. А указатель - меч в деснице разящей ногу! Постоянно постоянен в своём постоянстве.
0
01.11.2020, 23:38

Не по теме:

Цитата Сообщение от JeyCi Посмотреть сообщение
равнение скорости NTL и STD (выигрыш 1-го)
Не смущает, что бенчмарки там из позапрошлого десятилетия?

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
160
Ответ Создать тему
Новые блоги и статьи
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru