97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
1

Динамическая память против статической

06.02.2018, 18:43. Показов 4747. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу математическую библиотеку. Сначала писал как обычно - class Vector {int a, int b, int c}.
Чуть позже подумал - может все на динамическую память перенести?
Я в программировании новичок и отличия между динамической и статической памятью знаю лишь косвенные. (Логично, что динамическая память позволяет создавать переменные прямо в программе)
Так вот, стоить ли тратить время на написания такой библиотеки или не стоит свеч?
И вопрос туда же - что будет, если оператором new выделить память по объект класса, содержащие указатели на какой-то участок памяти?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2018, 18:43
Ответы с готовыми решениями:

Азы: статическая память, динамическая память, автоматическая память
столько раз приходистя возвращаться к началу, и все благодаря моим преподавателям, которые не...

Статическая память,Динамическая память.
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные...

Динамическая память
int set_arr(char* arr, int size, int pos, char* str) { if (pos <0 || size <= 0) { return 1;...

Динамическая память
Есть 2 массива одной размерности: int *m1 = new int , *m2 = new int ; где N, M некие...

14
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
06.02.2018, 18:46 2
Цитата Сообщение от Diochrome Посмотреть сообщение
Логично, что динамическая память позволяет создавать переменные прямо в программе
Что? И что тогда не динамическая из себя представляет?
0
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
06.02.2018, 19:33  [ТС] 3
Я имел ввиду, что переменные статического вида создаются на этапе компиляции, а динамические позволяют на этапе работы программы.
0
115 / 83 / 43
Регистрация: 19.01.2018
Сообщений: 484
06.02.2018, 19:50 4
Diochrome, немножко ты не прав, под динамические объекты выделяется память, и удаляется не при выходе из их поля видимости(как у статических),а её нужно самому убирать через delete, но есть исключение, например умные указатели, где память освобождается сама.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
06.02.2018, 20:03 5
Цитата Сообщение от Diochrome Посмотреть сообщение
Так вот, стоить ли тратить время на написания такой библиотеки или не стоит свеч?
"Всё уже написано до нас" (с) http://en.cppreference.com/w/cpp/container/vector

Цитата Сообщение от Diochrome Посмотреть сообщение
И вопрос туда же - что будет, если оператором new выделить память по объект класса, содержащие указатели на какой-то участок памяти?
Ничего. Это нормально. Только указателями надо управлять c помощью unique_ptr или shared_ptr и т.д. И вектор тогда будет вида

C++
1
::std::vector<::std::unique_ptr<MyType>> v{{new MyType()}, {new MyType()}, ...};
1
97 / 11 / 1
Регистрация: 14.03.2017
Сообщений: 196
06.02.2018, 20:16  [ТС] 6
Цитата Сообщение от outoftime Посмотреть сообщение
"Всё уже написано до нас" (с) http://en.cppreference.com/w/cpp/container/vector
Вы не совсем поняли. Мне не нужен бесконечный массив. Мне нужно лишь 3 элемента.
Вопрос в другом - насколько это вообще выгодно и целесообразно. Удалить то я удалю через деструктор, просто мне нужно понять, чем это выгодней.
С указателями умными указателями я пока не знаком.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
06.02.2018, 20:30 7
Цитата Сообщение от Diochrome Посмотреть сообщение
Удалить то я удалю через деструктор, просто мне нужно понять, чем это выгодней.
С указателями умными указателями я пока не знаком.
Меньше шансов допустить ошибку.

Цитата Сообщение от Diochrome Посмотреть сообщение
Вопрос в другом - насколько это вообще выгодно и целесообразно.
"Зачем тратить время на обучение, если невежество мгновенно?"
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
06.02.2018, 20:49 8
Лучший ответ Сообщение было отмечено Diochrome как решение

Решение

Основных отличий у динамической и статической памяти 2:
1. Статическая расходует память компьютера с момента запуска программы и до конца работы программы, а динамическая - как угодно.
2. Непосредственно выделение/высвобождение динамической памяти происходит долго.

Всё.
У динамической есть плюшка вида: дать памяти под массив во время работы программы.

Динамическая выгодна когда не знаешь заранее сколько тебе нужно, когда понятно, что придётся перераспределять (укорачивать {массив/список/нечто похожее} или наоборот расширять)

Динамическая выгодна для организации сложных структур данных.
Если вам нужно только 3 элемента и однозначно только три элемента - динамическая память вам не нужна.
1
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
06.02.2018, 21:08 9
daslex, Ты о стеке забыл. Если у тебя есть thread, все данные в потоке ложаться в стек и выделяя большые объемы данных ты стек переполнишь, надо в куче выделять (вроде так)
2
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
06.02.2018, 21:12 10
Он новичок. У него нет потоков.

Добавлено через 2 минуты

Не по теме:

И не забыл я, а не знаю того.

0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
06.02.2018, 22:35 11
Цитата Сообщение от daslex Посмотреть сообщение
Динамическая выгодна когда не знаешь заранее сколько тебе нужно, когда понятно, что придётся перераспределять (укорачивать {массив/список/нечто похожее} или наоборот расширять)
daslex, можно попросить Вас рассказать, как правильно расширить (увеличить) память динамического массива, содержащего элементы без потери этих элементов
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
06.02.2018, 22:41 12
Yetty, http://en.cppreference.com/w/cpp/memory/c/realloc

The reallocation is done by either:

a) expanding or contracting the existing area pointed to by ptr, if possible. The contents of the area remain unchanged up to the lesser of the new and old sizes. If the area is expanded, the contents of the new part of the array are undefined.
b) allocating a new memory block of size new_size bytes, copying memory area with size equal the lesser of the new and the old sizes, and freeing the old block.
Есть еще русский вариант http://ru.cppreference.com/w/cpp/memory/c/realloc

Перераспределение может быть выполнено одним из двух способов:

a) По возможности происходит расширение или усечение имеющейся области с указателем ptr. Содержимое этой области останется нетронутым для первых new_size байт памяти. Если область расширяется, то содержимое добавляемой части памяти не определено.
b) Выделение новой области памяти размером в new_size байт, копирование туда первых new_size байт старой области и освобождение старого блока памяти.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
07.02.2018, 10:16 13
Переменные, выделенные статически обладают временем жизни соответствующей функции (для глобальных и main оно равно времени выполнения программы). Они автоматически выделяются и удаляются при запуске и завершении соответствующей функции. Это происходит на стеке фиксированного размера (по умолчанию 8 МБ вроде).
Динамические переменные выделяются на куче, то есть чем их больше, тем больше памяти требует приложение. Грубо говоря, общая занимаемая им память равна RAM = stack + N, где stack - стек, те самые 8 МБ, а N - все динамические переменные. Управлять временем жизни динамических переменных надо вручную командами malloc/free или new/delete.
C++
1
2
3
4
5
6
int func(){
  int static_var; //статическая переменная, после завершения функции она будет удалена
  int *dynamic_var = new int; //динамическая переменная
...
  delete dynamic_var; //если забыть освободить память, произойдет утечка. Это очень плохо, не допускайте такого иначе вылезет Ктулху и сожрет вас
}
Это на счет контекста, предложенного ТСом, но есть и другое разделение по ключевому слову static:
C
1
2
3
4
5
6
7
int func2(){
  int local_var=0; //локальная переменная, удаляется после завершения функции
  static int static_var=0; //статическая переменная, не удаляется после завершения функции
  local_var++; //local_var при каждом запуске будет 0, после инкремента - 1
  static_var++; //static_var при первом запуске будет 0, при каждом инкременте - увеличиваться
  printf("%i %i\n", local_var, static_var);
}
Если переменная объявлена как static, то она считается глобальной за исключением области видимости. То есть существует все время выполнения программы, но доступна только из своей функции.
1
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
07.02.2018, 10:28 14
Diochrome, Динамической вообще то есть 2 вида - стек и куча. Разница между ними - стек высвобождается в порядке строго обратном распределению, куча в произвольном. при этом высвобождение стека зона ответственности компилятора, Кучи - зона ответственности программиста. А статическая это сегмент данных - т.е. глобальные переменные (включая static переменные функций и static поля классов). Но очень часто касательно плюсов путают понятие статическая с понятием стек. Причина в одинаковом синтаксисе объявления глобальных переменных и переменных на стеке, отличия только в области видимости в которой они объявляются.
При этом есть золотое правило - пока можешь пользовать стек не трогай кучу вонять не будет.
1
69 / 57 / 14
Регистрация: 20.12.2013
Сообщений: 656
07.02.2018, 14:53 15
Вон строки в STL выделяют данные на стеке для небольших строк и в куче для больших.
0
07.02.2018, 14:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2018, 14:53
Помогаю со студенческими работами здесь

Динамическая память
Короче, есть у моего шаблонного класса один метод, который принимает в качестве параметра указатель...

Динамическая память
в чем ошибка #include &lt;iostream&gt; #include &quot;conio.h&quot; using namespace std; class{A int a;...

Динамическая память [new]
Если записать так: char *p; p = new char; cin&gt;&gt;p; for(int i=0; i&lt;strlen(p); i++)...

Динамическая память
Каким способом можно задать динамическую память , кроме как через new ?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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