Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
#1

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

13.12.2012, 06:06. Просмотров 1485. Ответов 41
Метки нет (Все метки)

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

Выделение динамической памяти
Всем привет. Возникла задача, в которой мне необходимо знать как выделяется...

Освобождение динамической памяти
После первого вызова функции(при повторном) пишет ошибку. В функции sort один...

Удаление динамической памяти
Всем здрасьте. Имеется вот такая структура. struct ModelType { DWORD FVF;...

Вопросы по динамической памяти.
У меня вопросы по работе с динамической памятью. Пожалуйста, помогите...

Перераспределение динамической памяти
дан двумерный массив 3х5 выделить динамически память под него, затем...

41
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 18:25 #21
Это, вы не путайте выделение виртуальной памяти процессам и выделение памяти прикладным программам. За первое отвечает ОС, за второе — аллокатор конкретного рантайма, который линкуется к собираемой программе. ОС обычно выделяет память или сразу страницами, или из одной или нескольких куч. А конкретный аллокатор (читай: реализация operator new/malloc) уже сама распиливает выданную виртуальную память на кусочки, ведёт учёт выданных байтиков, возвращает память обратно ОС и так далее.
1
v.a.l.i.d
416 / 381 / 113
Регистрация: 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]);
0
ValeryS
Модератор
7170 / 5437 / 674
Регистрация: 14.02.2011
Сообщений: 18,372
13.12.2012, 18:30 #23
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Но ведь это подходит для статического массива, а для динамического уже нет
это почему еще???
0
v.a.l.i.d
416 / 381 / 113
Регистрация: 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]) одно и тоже число показывают?
0
activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
13.12.2012, 18:39 #25
sizeof(a) / sizeof(a[0]) по моему глупо. Учитывая что массив статический: 1. мы знаем его размер, 2. мы знаем тип данных. И все равно продолжаем заниматься ерундой с макросами sizeof().
0
ValeryS
Модератор
7170 / 5437 / 674
Регистрация: 14.02.2011
Сообщений: 18,372
13.12.2012, 18:45 #26
v.a.l.i.d,
был не прав, признаю
видать не сталкивался с этим
потому что если я выделяю память то знаю сколько и чего
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
13.12.2012, 18:51  [ТС] #27
То есть память выделяется в два этапа? Тогда как ведёт себя gcc на винде?
0
ValeryS
Модератор
7170 / 5437 / 674
Регистрация: 14.02.2011
Сообщений: 18,372
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])
выручает
а таблицы могут быть по несколько страниц и что количество элементов на пальцах считать?
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
13.12.2012, 18:52  [ТС] #29
Цитата Сообщение от v.a.l.i.d Посмотреть сообщение
Как узнать размер динамического массива если sizeof(a) и sizeof(a[0]) одно и тоже число показывают?
Не совсем. sizeof(a) покажет размер указателя, то есть разрядность системы, выраженную в байтах.
0
ValeryS
Модератор
7170 / 5437 / 674
Регистрация: 14.02.2011
Сообщений: 18,372
13.12.2012, 18:57 #30
v.a.l.i.d,
я сейчас понял почему не работает для динамики
sizeof расчитавает размер на этапе компиляции ( подсмотрел листинг ассемблерный)
а на этапе компиляции размер неизвестен( посему дает размер указателя)
выход: запоминай размер

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

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

Цитата Сообщение от taras atavin Посмотреть сообщение
том, как учёт памяти ведёт сторонний код.
А кто его знает как, запоминает где то
зависит и от компилятора и от системы и от архитектуры железа
0
taras atavin
4204 / 1764 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
13.12.2012, 19:18  [ТС] #35
AMD 64, винда x64, а компил 32-х битный.
0
activnaya
256 / 46 / 4
Регистрация: 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'ы.
1
dasha00000
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 2
13.12.2012, 19:20 #37
помогите,модуль по информатике у меня завтра,сама сделать не могу....выполнить сортировку элементов двумерного массива,расположенных на главной диагонали.результат вывести на экран
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
13.12.2012, 19:22 #38
Цитата Сообщение от taras atavin Посмотреть сообщение
И как он себя ведёт?
Вот как только Microsoft выложит его исходники, так и скажу.
1
dasha00000
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 2
13.12.2012, 19:22 #39
taras atavin, выполнить сортировку элементов двумерного массива,расположенных на главной диагонали.результат вывести на экран
0
ValeryS
Модератор
7170 / 5437 / 674
Регистрация: 14.02.2011
Сообщений: 18,372
13.12.2012, 19:33 #40
Цитата Сообщение от activnaya Посмотреть сообщение
Где это видно чтобы статический массив изменял размер?
А никто и не говорит что он изменяет размер во время работы
просто дописывая/ правя программу я могу изменить размер массива и мне придется править весь код если не воспользуюсь
C++
1
sizeof(a) / sizeof(a[0])
Цитата Сообщение от activnaya Посмотреть сообщение
Эти заморочки с sizeof()'ами только для удобства поддержки кода.
вот именно
Цитата Сообщение от activnaya Посмотреть сообщение
И то, лучше уж дефайнить размер чем мутить sizeof'ы.
не возбраняется
в каждой палатке свои порядки
0
13.12.2012, 19:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 19:33

Перераспределение динамической памяти
дан двумерный массив 3х5 выделить динамически память под него, затем...

выделение динамической памяти
помогите пожалуйста , нужно написать функцию для ввода новой матрицы, не...

Удаление new из динамической памяти
Здравствуйте, у меня есть следующее присвоение: sign-&gt;numb = new int; Мне...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru