264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,554

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

08.10.2020, 18:18. Показов 15847. Ответов 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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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,554
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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
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,554
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,554
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,554
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,554
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,554
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru