Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
#1

Представление памяти, указатели - C++

14.02.2014, 23:54. Просмотров 2078. Ответов 55
Метки нет (Все метки)

Доброго времени суток, форумчане.
Практика языка и программирования уже есть, но всё на начальном уровне. Сейчас вплотную столкнулся с указателями. Везде пишут, что они для экономии памяти, динамических массивов и много другого...
Как известно любой указатель весит 4 байта. При создании объекта используются именно эти 4 байта, при удалении оного они освобождаются. Собственно вопрос: где находятся сами объекты?
В кач-ве эксперимента проверял выделение физической памяти во время работы программы. При создании/удалении выделялось/освобождалось 4 байта соответственно. Сами объекты были намного большего размера.
Где же они "висят"?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2014, 23:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Представление памяти, указатели (C++):

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

Представление класса в памяти
Всем доброго времени суток! Подскажите ка,как класс представляется в...

Представление и структура указателя в памяти
Указатель занимает 4 байта памяти. Если судить по определению "указатель - это...

Представление в памяти массивов и матриц
Помогите решить эту задачу в С++ Для разряженной матрицы целых чисел в...

Внутреннее представление числа в памяти
нужно сделать реализацию числа в памятиfloat d1 = 72.9e-8;... а как??? это...

Двоичное представление области памяти
Здравствуйте. В одной из лабораторных работ требуется взять готовые функции из...

55
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
14.02.2014, 23:58 #2
Цитата Сообщение от Arkaniy Посмотреть сообщение
Где же они "висят"?
Сами объекты - в динамической памяти (heap)

Добавлено через 2 минуты
Цитата Сообщение от Arkaniy Посмотреть сообщение
Как известно любой указатель весит 4 байта
Ну, строго говоря, это справедливо далеко не для всех платформ.
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
15.02.2014, 00:02  [ТС] #3
DrOffset, спасибо за ссылку. Вроде понял.
Еще 1 вопрос. Как изменить выделенную память, которая была выделена с помощью new? (прошу прощение за тавтологию)

Добавлено через 56 секунд
Пока работал только в окнах и все знания ограничены только этой ОС.
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
15.02.2014, 00:02 #4
Цитата Сообщение от Arkaniy Посмотреть сообщение
Как изменить выделенную память, которая была выделена с помощью new
Что значит изменить? Размер ? Освободить ее с помощью delete, а затем заново выделить
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
15.02.2014, 00:06  [ТС] #5
KOPOJI, да, размер. Но тогда ведь она выделится в другом месте, так сказать.
А именно расширить можно?

Добавлено через 2 минуты
Нашел то, что искал. Как я понял, так сделать нельзя. Спасибо за ответы.
0
KOPOJI
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16744 / 6635 / 860
Регистрация: 12.06.2012
Сообщений: 19,880
Завершенные тесты: 1
15.02.2014, 00:08 #6
Цитата Сообщение от Arkaniy Посмотреть сообщение
А именно расширить можно?
Насколько мне известно, нет.

Добавлено через 25 секунд

Не по теме:

а, уже неактуально..



Добавлено через 1 минуту
З.Ы. Если только написать свои функции new/delete..
0
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
15.02.2014, 00:10  [ТС] #7
KOPOJI, сейчас вообще не представляю, как эти ф-ции работают. Врядли сам смогу написать.
Возможно в будущем
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
15.02.2014, 00:29 #8
Цитата Сообщение от Arkaniy Посмотреть сообщение
KOPOJI, да, размер. Но тогда ведь она выделится в другом месте, так сказать.
А именно расширить можно?

Добавлено через 2 минуты
Нашел то, что искал. Как я понял, так сделать нельзя. Спасибо за ответы.
На самом деле возможность такого действия ограничивается реализацией менеджера памяти. Т.к. менеджер памяти пытается выделить непрерывный блок заданного размера, то невозможность именно расширить (в общем случае) обуславливается тем, что нужно найти и выделить непрерывный блок бОльшего размера. Т.к. такой блок совсем не обязательно удастся расположить в том же месте где он был до этого, то придется искать новое место. Но, если почитать документацию к функции realloc:
The function may move the memory block to a new location (whose address is returned by the function).
То есть это как раз то, о чем я говорил. Реализация менеджера памяти может быть оптимизирована под случаи, когда память таки возможно выделить с увеличением в том же месте (уточню. must вместо may указывала бы на невозможность этого). На это безусловно нельзя полагаться в общем случае. Однако, если реализовывать свой менеджер памяти в рамках конкретной задачи можно добиться гарантии такого поведения.

Добавлено через 3 минуты
PS.
Конкретно для new и delete не существует увеличивающих размер версий. Зато есть семейство функций malloc.
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
10.03.2014, 19:59  [ТС] #9
Подниму старую тему.
Вопрос с перераспределением памяти остался открытым. Неужели в С++ нет средств для расширения выделенной памяти? Я думал, что аллокаторы для этой цели пригодятся, но найти описания "для чайников" не могу. Да и там, где нашел, про перераспределение нету(или таки не нашел).
Если способ всё же нету, то пойду через Си'шный мэллок.
0
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,224
10.03.2014, 20:08 #10
Цитата Сообщение от Arkaniy Посмотреть сообщение
Вопрос с перераспределением памяти остался открытым. Неужели в С++ нет средств для расширения выделенной памяти?
есть
пришло из Си
malloc выделение памяти
realloc изменение размера
free удаление
разница в том что malloc в отличии от new выделяет "сырую" память без вызова конструкторов
на встроенных типах не заметишь а на своих( да и не своих) классах очень да
есть другой путь динамический массив (vector) все проблемы с перераспределением памяти уходят
1
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
10.03.2014, 20:35 #11
Цитата Сообщение от ValeryS Посмотреть сообщение
realloc изменение размера
Небольшое уточнение. Не факт что будет именно расширение размера, возможно будет полное перевыделение памяти.
0
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,224
10.03.2014, 20:39 #12
Цитата Сообщение от Croessmah Посмотреть сообщение
Не факт что будет именно расширение размера, возможно будет полное перевыделение памяти.
с точки зрения менеджера памяти даже скорее всего
ассемблерный листинг показывает новое выделение и копирование( хотя здесь и компилятор завязан и ОС)
а сточки зрения программиста даже незаметно
никто же не оперирует конкретным адресом
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.03.2014, 20:48 #13
Цитата Сообщение от ValeryS Посмотреть сообщение
ассемблерный листинг показывает новое выделение и копирование( хотя здесь и компилятор завязан и ОС)
realloc делает тоже самое.
0
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,224
10.03.2014, 20:52 #14
Цитата Сообщение от DrOffset Посмотреть сообщение
realloc делает тоже самое.
я про него и говорю
но гарантировать что это всегда так, не могу
0
Croessmah
++Ͻ
14160 / 8085 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
10.03.2014, 21:14 #15
О realloc:
Представление памяти, указатели
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 00:15  [ТС] #16
Всем спасибо за ответы. Вроде как разобрался. Для решения своей задачи использовал вектора.
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
12.03.2014, 02:40 #17
Цитата Сообщение от Arkaniy Посмотреть сообщение
Вопрос с перераспределением памяти остался открытым
Вектор, но вектора нудные, ИМХО. Что мешает выделить память бОльшего размера, скопировать в неё данные из старой и удалить старую. Не самое быстрое, что можно придумать, но простое.

Была когда-то идея в конце выделенной памяти оставлять место для адреса продолжения, но это не весело. Оказалось, надо учитывать, что компо-железяка не знает кто из данных - данные, а кто из них адрес на следующий кусок данных. Таблицы и прочая ересь очень вдохновляет на героичность, но не на долго, особенно, когда хочется ещё и другие вкусности осилить. Поэтому, либо new,copy,delete, либо, если размер постоянно меняется, но он не очень большой, то структуры/классы с адресом, раз уж мы о двойной сумме, хотя думаю, это зависит от предпочтений.
0
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,224
12.03.2014, 07:04 #18
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Вектор, но вектора нудные, ИМХО. Что мешает выделить память бОльшего размера, скопировать в неё данные из старой и удалить старую. Не самое быстрое, что можно придумать, но простое.
а вектор не так действует?
да и что в нем нудного? обращение как к обыкновенному массиву
0
Tulosba
12.03.2014, 12:10
  #19

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
да и что в нем нудного?
Конечно нудно. Рабочий, проверенный временем стандартный библиотечный код. Пишешь, и он делает то, что нужно. То ли дело - криворукописные реализации, в которых не пойми откуда вылезают веселые жучки неизвестного происхождения. Поиски ошибок, исправления, создание тем на форуме как же победить этих гадов. Вот оно, безудержное веселье.

0
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 14:28  [ТС] #20
Retyrn0, нудно - не нудно, а пока главное, чтобы работало.
Да и ValeryS верно подметил что вектор - это тоже копирование в больший участок памяти и освобождение старого.
Tulosba,
0
12.03.2014, 14:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 14:28
Привет! Вот еще темы с решениями:

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

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

Представление памяти std::vector
Добрый день! Вопрос по вектору, из его описание следует, что он располагает...

Представление в памяти массивов и матриц
Для разряженной матрицы целых чисел создать модуль доступа к ней: -все нулевые...


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

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

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