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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
#1

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

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

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

Представление чисел в памяти! - C++
нужна сделать реализацию числа в памяти получилось для одного числа, а как сделать для нескольких, т.е передаю {1,1,0,0} выдаст {0,0,1,1},...

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
14.02.2014, 23:58 #2
Цитата Сообщение от Arkaniy Посмотреть сообщение
Где же они "висят"?
Сами объекты - в динамической памяти (heap)

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

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

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

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

Не по теме:

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



Добавлено через 1 минуту
З.Ы. Если только написать свои функции new/delete..
0
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
15.02.2014, 00:10  [ТС] #7
KOPOJI, сейчас вообще не представляю, как эти ф-ции работают. Врядли сам смогу написать.
Возможно в будущем
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
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 / 6
Регистрация: 29.08.2012
Сообщений: 453
10.03.2014, 19:59  [ТС] #9
Подниму старую тему.
Вопрос с перераспределением памяти остался открытым. Неужели в С++ нет средств для расширения выделенной памяти? Я думал, что аллокаторы для этой цели пригодятся, но найти описания "для чайников" не могу. Да и там, где нашел, про перераспределение нету(или таки не нашел).
Если способ всё же нету, то пойду через Си'шный мэллок.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
10.03.2014, 20:08 #10
Цитата Сообщение от Arkaniy Посмотреть сообщение
Вопрос с перераспределением памяти остался открытым. Неужели в С++ нет средств для расширения выделенной памяти?
есть
пришло из Си
malloc выделение памяти
realloc изменение размера
free удаление
разница в том что malloc в отличии от new выделяет "сырую" память без вызова конструкторов
на встроенных типах не заметишь а на своих( да и не своих) классах очень да
есть другой путь динамический массив (vector) все проблемы с перераспределением памяти уходят
1
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
10.03.2014, 20:35 #11
Цитата Сообщение от ValeryS Посмотреть сообщение
realloc изменение размера
Небольшое уточнение. Не факт что будет именно расширение размера, возможно будет полное перевыделение памяти.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
10.03.2014, 20:39 #12
Цитата Сообщение от Croessmah Посмотреть сообщение
Не факт что будет именно расширение размера, возможно будет полное перевыделение памяти.
с точки зрения менеджера памяти даже скорее всего
ассемблерный листинг показывает новое выделение и копирование( хотя здесь и компилятор завязан и ОС)
а сточки зрения программиста даже незаметно
никто же не оперирует конкретным адресом
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,093
10.03.2014, 20:48 #13
Цитата Сообщение от ValeryS Посмотреть сообщение
ассемблерный листинг показывает новое выделение и копирование( хотя здесь и компилятор завязан и ОС)
realloc делает тоже самое.
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,849
10.03.2014, 20:52 #14
Цитата Сообщение от DrOffset Посмотреть сообщение
realloc делает тоже самое.
я про него и говорю
но гарантировать что это всегда так, не могу
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
10.03.2014, 21:14 #15
О realloc:
Представление памяти, указатели
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 21:14
Привет! Вот еще темы с ответами:

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

Представление в памяти массивов и матриц - C++
Здравствуйте всем!!!Помогите пожалуйста, нужно написать код программы на следующую задачу: Цель работы – получение практических...

Представление в памяти массивов и матриц - C++
Помогите разработать модуль доступа к разреженной матрице, где все нулевые элементы размещены на местах с нечетными индексами строк и...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.03.2014, 21:14
Ответ Создать тему
Опции темы

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