Форум программистов, компьютерный форум CyberForum.ru

Теория по динамической памяти - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 06:06     Теория по динамической памяти #1
Предположим, применяется оператор new в форме для массива:
C++
1
p=new int [n];
. n ведь может быть и большим. Может n==1000000? Где запоминается, сколько выделено памяти и откуда система знает, сколько надо освободить памяти по
C++
1
delete [] p;
? Ведь там то я n не указываю. Может надо освободить сразу много страниц? Освобождаются все страницы, расположенные подряд? Эйси. А если я сначала выделили две страницы, а потом ещё три и все пять оказались подряд? А освобождаю сначала две? За счёт чего система заберёт только первую страницу, а не все пять? Или они не могут быть подряд?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2012, 06:06     Теория по динамической памяти
Посмотрите здесь:

C++ Вопрос по динамической памяти
Переменная в динамической памяти C++
C++ Массив в динамической памяти
C++ выделение динамической памяти
C++ Выделение динамической памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 18:25     Теория по динамической памяти #21
Это, вы не путайте выделение виртуальной памяти процессам и выделение памяти прикладным программам. За первое отвечает ОС, за второе — аллокатор конкретного рантайма, который линкуется к собираемой программе. ОС обычно выделяет память или сразу страницами, или из одной или нескольких куч. А конкретный аллокатор (читай: реализация operator new/malloc) уже сама распиливает выданную виртуальную память на кусочки, ведёт учёт выданных байтиков, возвращает память обратно ОС и так далее.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
13.12.2012, 18:27     Теория по динамической памяти #22
Цитата Сообщение от ValeryS Посмотреть сообщение
я вообще то всегда так делал
Но ведь это подходит для статического массива, а для динамического уже нет

taras atavin,
C++
1
std::cout << i << ", " << p[i] << ", " << (unsigned int)*((int*)p-4) / sizeof(p[0]);
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
13.12.2012, 18:30     Теория по динамической памяти #23
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Но ведь это подходит для статического массива, а для динамического уже нет
это почему еще???
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
13.12.2012, 18:38     Теория по динамической памяти #24
Цитата Сообщение от ValeryS Посмотреть сообщение
это почему еще???
C++
1
2
3
4
5
int *a;
a = new int[20];
 
cout << sizeof(a) << endl;      // 4!
cout << sizeof(a[0]) << endl;   // 4
Как узнать размер динамического массива если sizeof(a) и sizeof(a[0]) одно и тоже число показывают?
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 18:39     Теория по динамической памяти #25
sizeof(a) / sizeof(a[0]) по моему глупо. Учитывая что массив статический: 1. мы знаем его размер, 2. мы знаем тип данных. И все равно продолжаем заниматься ерундой с макросами sizeof().
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
13.12.2012, 18:45     Теория по динамической памяти #26
v.a.l.i.d,
был не прав, признаю
видать не сталкивался с этим
потому что если я выделяю память то знаю сколько и чего
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 18:51  [ТС]     Теория по динамической памяти #27
То есть память выделяется в два этапа? Тогда как ведёт себя gcc на винде?
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
13.12.2012, 18:51     Теория по динамической памяти #28
Цитата Сообщение от activnaya Посмотреть сообщение
sizeof(a) / sizeof(a[0]) по моему глупо. Учитывая что массив статический: 1. мы знаем его размер, 2. мы знаем тип данных.
а размер то мы знаем но не всегда подсчитать можем
например
C++
1
int a[]={12,15,34,45}
и во всех циклах обращениях мы вбиваем 4
но потом данные увеличились дописали в программку
C++
1
int a[]={12,15,34,45,6,78}
мне придется пройти по всей программе и поменять 4 на 6
и вот здесь
C++
1
sizeof(a) / sizeof(a[0])
выручает
а таблицы могут быть по несколько страниц и что количество элементов на пальцах считать?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 18:52  [ТС]     Теория по динамической памяти #29
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Как узнать размер динамического массива если sizeof(a) и sizeof(a[0]) одно и тоже число показывают?
Не совсем. sizeof(a) покажет размер указателя, то есть разрядность системы, выраженную в байтах.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
13.12.2012, 18:57     Теория по динамической памяти #30
v.a.l.i.d,
я сейчас понял почему не работает для динамики
sizeof расчитавает размер на этапе компиляции ( подсмотрел листинг ассемблерный)
а на этапе компиляции размер неизвестен( посему дает размер указателя)
выход: запоминай размер

есть еще один способ
выделяем память на 2 элемента(1 элемент) больше
и в начале и в конце (или только в конце) записываем маркер значение которое никогда не будет присвоено
и потом в цикле ищем этот маркер
в частности так ищется длинна строк( ищем 0)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 19:06  [ТС]     Теория по динамической памяти #31
Вот только терминальный ноль мне объяснять не надо. Речь не о фокусах прилады, а о том, как учёт памяти ведёт сторонний код.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:09     Теория по динамической памяти #32
Цитата Сообщение от taras atavin Посмотреть сообщение
То есть память выделяется в два этапа? Тогда как ведёт себя gcc на винде?
Использует аллокатор из msvcrt.dll (gcc из MinGW, как минимум)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 19:14  [ТС]     Теория по динамической памяти #33
Я перепутал, как делится адрес. В страницу помещается 4096 чаров, перерасход в 128 раз, а чтоб выйти по памяти надо четверть миллиарда массивов по 32.

Добавлено через 2 минуты
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Использует аллокатор из msvcrt.dll (gcc из MinGW, как минимум)
И как он себя ведёт?
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
13.12.2012, 19:17     Теория по динамической памяти #34
Цитата Сообщение от taras atavin Посмотреть сообщение
Вот только терминальный ноль мне объяснять не надо.
а я и не тебе, я v.a.l.i.dу

Цитата Сообщение от taras atavin Посмотреть сообщение
том, как учёт памяти ведёт сторонний код.
А кто его знает как, запоминает где то
зависит и от компилятора и от системы и от архитектуры железа
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
13.12.2012, 19:18  [ТС]     Теория по динамической памяти #35
AMD 64, винда x64, а компил 32-х битный.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 19:19     Теория по динамической памяти #36
Цитата Сообщение от ValeryS Посмотреть сообщение
а размер то мы знаем но не всегда подсчитать можем
например
C++
1
int a[]={12,15,34,45}
и во всех циклах обращениях мы вбиваем 4
но потом данные увеличились дописали в программку
C++
1
int a[]={12,15,34,45,6,78}
мне придется пройти по всей программе и поменять 4 на 6
и вот здесь
C++
1
sizeof(a) / sizeof(a[0])
выручает
а таблицы могут быть по несколько страниц и что количество элементов на пальцах считать?
ЩИТО? Где это видно чтобы статический массив изменял размер?А если это VLA, то размер мы знаем. Эти заморочки с sizeof()'ами только для удобства поддержки кода. И то, лучше уж дефайнить размер чем мутить sizeof'ы.
dasha00000
Сообщений: n/a
13.12.2012, 19:20     Теория по динамической памяти #37
помогите,модуль по информатике у меня завтра,сама сделать не могу....выполнить сортировку элементов двумерного массива,расположенных на главной диагонали.результат вывести на экран
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:22     Теория по динамической памяти #38
Цитата Сообщение от taras atavin Посмотреть сообщение
И как он себя ведёт?
Вот как только Microsoft выложит его исходники, так и скажу.
dasha00000
Сообщений: n/a
13.12.2012, 19:22     Теория по динамической памяти #39
taras atavin, выполнить сортировку элементов двумерного массива,расположенных на главной диагонали.результат вывести на экран
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 19:33     Теория по динамической памяти
Еще ссылки по теме:

C++ Удаление динамической памяти
C++ Переменные в динамической памяти!
C++ Выделение динамической памяти

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
13.12.2012, 19:33     Теория по динамической памяти #40
Цитата Сообщение от activnaya Посмотреть сообщение
Где это видно чтобы статический массив изменял размер?
А никто и не говорит что он изменяет размер во время работы
просто дописывая/ правя программу я могу изменить размер массива и мне придется править весь код если не воспользуюсь
C++
1
sizeof(a) / sizeof(a[0])
Цитата Сообщение от activnaya Посмотреть сообщение
Эти заморочки с sizeof()'ами только для удобства поддержки кода.
вот именно
Цитата Сообщение от activnaya Посмотреть сообщение
И то, лучше уж дефайнить размер чем мутить sizeof'ы.
не возбраняется
в каждой палатке свои порядки
Yandex
Объявления
13.12.2012, 19:33     Теория по динамической памяти
Ответ Создать тему
Опции темы

Текущее время: 12:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru