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

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

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

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

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

Доброго времени суток, форумчане.
Практика языка и программирования уже есть, но всё на начальном уровне. Сейчас вплотную столкнулся с указателями. Везде пишут, что они для экономии памяти, динамических массивов и много другого...
Как известно любой указатель весит 4 байта. При создании объекта используются именно эти 4 байта, при удалении оного они освобождаются. Собственно вопрос: где находятся сами объекты?
В кач-ве эксперимента проверял выделение физической памяти во время работы программы. При создании/удалении выделялось/освобождалось 4 байта соответственно. Сами объекты были намного большего размера.
Где же они "висят"?
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++
Помогите решить эту задачу в С++ Для разряженной матрицы целых чисел в соответствии с индивидуальным заданием создать модуль доступа к...

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
14.02.2014, 23:58     Представление памяти, указатели #2
Цитата Сообщение от Arkaniy Посмотреть сообщение
Где же они "висят"?
Сами объекты - в динамической памяти (heap)

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

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

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

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

Не по теме:

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



Добавлено через 1 минуту
З.Ы. Если только написать свои функции new/delete..
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
15.02.2014, 00:10  [ТС]     Представление памяти, указатели #7
KOPOJI, сейчас вообще не представляю, как эти ф-ции работают. Врядли сам смогу написать.
Возможно в будущем
DrOffset
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
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.
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
10.03.2014, 19:59  [ТС]     Представление памяти, указатели #9
Подниму старую тему.
Вопрос с перераспределением памяти остался открытым. Неужели в С++ нет средств для расширения выделенной памяти? Я думал, что аллокаторы для этой цели пригодятся, но найти описания "для чайников" не могу. Да и там, где нашел, про перераспределение нету(или таки не нашел).
Если способ всё же нету, то пойду через Си'шный мэллок.
ValeryS
Модератор
6543 / 5009 / 462
Регистрация: 14.02.2011
Сообщений: 16,656
10.03.2014, 20:08     Представление памяти, указатели #10
Цитата Сообщение от Arkaniy Посмотреть сообщение
Вопрос с перераспределением памяти остался открытым. Неужели в С++ нет средств для расширения выделенной памяти?
есть
пришло из Си
malloc выделение памяти
realloc изменение размера
free удаление
разница в том что malloc в отличии от new выделяет "сырую" память без вызова конструкторов
на встроенных типах не заметишь а на своих( да и не своих) классах очень да
есть другой путь динамический массив (vector) все проблемы с перераспределением памяти уходят
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
10.03.2014, 20:35     Представление памяти, указатели #11
Цитата Сообщение от ValeryS Посмотреть сообщение
realloc изменение размера
Небольшое уточнение. Не факт что будет именно расширение размера, возможно будет полное перевыделение памяти.
ValeryS
Модератор
6543 / 5009 / 462
Регистрация: 14.02.2011
Сообщений: 16,656
10.03.2014, 20:39     Представление памяти, указатели #12
Цитата Сообщение от Croessmah Посмотреть сообщение
Не факт что будет именно расширение размера, возможно будет полное перевыделение памяти.
с точки зрения менеджера памяти даже скорее всего
ассемблерный листинг показывает новое выделение и копирование( хотя здесь и компилятор завязан и ОС)
а сточки зрения программиста даже незаметно
никто же не оперирует конкретным адресом
DrOffset
6929 / 4122 / 942
Регистрация: 30.01.2014
Сообщений: 6,915
10.03.2014, 20:48     Представление памяти, указатели #13
Цитата Сообщение от ValeryS Посмотреть сообщение
ассемблерный листинг показывает новое выделение и копирование( хотя здесь и компилятор завязан и ОС)
realloc делает тоже самое.
ValeryS
Модератор
6543 / 5009 / 462
Регистрация: 14.02.2011
Сообщений: 16,656
10.03.2014, 20:52     Представление памяти, указатели #14
Цитата Сообщение от DrOffset Посмотреть сообщение
realloc делает тоже самое.
я про него и говорю
но гарантировать что это всегда так, не могу
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
10.03.2014, 21:14     Представление памяти, указатели #15
О realloc:
Представление памяти, указатели
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 00:15  [ТС]     Представление памяти, указатели #16
Всем спасибо за ответы. Вроде как разобрался. Для решения своей задачи использовал вектора.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
12.03.2014, 02:40     Представление памяти, указатели #17
Цитата Сообщение от Arkaniy Посмотреть сообщение
Вопрос с перераспределением памяти остался открытым
Вектор, но вектора нудные, ИМХО. Что мешает выделить память бОльшего размера, скопировать в неё данные из старой и удалить старую. Не самое быстрое, что можно придумать, но простое.

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 14:28     Представление памяти, указатели
Еще ссылки по теме:

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

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

Представление в памяти компьютера типа double - C++
нужна помощь в представление ВПК (в памяти компютера) тип данних double например нам дано такое: double y = -4.8e1 и хочем чтоб...

Указатели и очистка памяти - C++
Возник интересный вопрос... class Test { int a; }; class Test1 : public Test { int b, c; }; int main() { Test1 *t = new Test1; ...

Освобождение памяти и указатели - C++
int **Matrix1 = new int*; // Создаем 1-ю матрицу for (int i(0); i < N1; i++) Matrix1 = new int; Подскажите пожалуйста, как...


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

Или воспользуйтесь поиском по форуму:
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 14:28  [ТС]     Представление памяти, указатели #20
Retyrn0, нудно - не нудно, а пока главное, чтобы работало.
Да и ValeryS верно подметил что вектор - это тоже копирование в больший участок памяти и освобождение старого.
Tulosba,
Yandex
Объявления
12.03.2014, 14:28     Представление памяти, указатели
Ответ Создать тему
Опции темы

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