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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
14.02.2014, 23:54     Представление памяти, указатели #1
Доброго времени суток, форумчане.
Практика языка и программирования уже есть, но всё на начальном уровне. Сейчас вплотную столкнулся с указателями. Везде пишут, что они для экономии памяти, динамических массивов и много другого...
Как известно любой указатель весит 4 байта. При создании объекта используются именно эти 4 байта, при удалении оного они освобождаются. Собственно вопрос: где находятся сами объекты?
В кач-ве эксперимента проверял выделение физической памяти во время работы программы. При создании/удалении выделялось/освобождалось 4 байта соответственно. Сами объекты были намного большего размера.
Где же они "висят"?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,179
12.03.2014, 19:36     Представление памяти, указатели #41
Цитата Сообщение от Retyrn0 Посмотреть сообщение
но если ещё и понаглеть и подойти к памяти по другому, то ускорение очень значительное.
это называется написать свой менеджер памяти

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
Я не соглашаюсь
здесь должен быть вопрос
Я не соглашаюсь?
типа "Рабинович не сволочь? Я извиняюсь"

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
12.03.2014, 19:40     Представление памяти, указатели #42
Цитата Сообщение от ValeryS Посмотреть сообщение
с избытком там миллионов 10
В моей задаче постоянно то выделялась, то освобождалась память под массивы. Все никак не могли поместиться. Представьте, есть 3-d объекты, представленные в виде вокселов(не kd-деревьев, а именно массивов вокселов - так нужно было). Все объекты никак не могут вместиться в ограниченной оперативной памяти - нужно хитрить. Используем тот факт, что для правильного отображения объекта, количество "активных" воксклов можно уменьшить, в зависимости от расстояния до объекта. Камера движется - расстояние меняется постоянно, массивы постоянно меняются в размерах. Вам не рассказывать на сколько "динамична" сцена, где векторы используются?) А объектов-то может быть ух сколько.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
написать свой менеджер памяти
Вы мне льстите) До менеджера памяти мой алгоритм не дотягивал, мягко говоря) Но что абсолютно точно, векторы мне однозначно не помогли и никакие действия над векторами не выполняло задуманного, а new delete - ами можно извращаться на сколько душе угодно)
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 20:45  [ТС]     Представление памяти, указатели #43
Ох, ну и начался же тут холивар А всё с невинного вопроса.
Вобщем, много всего понаписано, но суть всё же одна: для разных целей разные подходы.
Retyrn0 был прав, когда писал, что программу я пишу в учебных целях, но это всё же не университетское задание, а так - для себя. Я попробую написать несколько вариантов. И с векторами сделаю, и мэллоком, и new-delete. Но вот раз пошел такой разговор об оптимизации, то, пожалуй, всё же спрошу. Как измеряется время работы программы, функции, отдельных участков кода и т.д.? Как понять мне что всё же будет быстрее? Знаю, что это уже на более низком уровне происходит, но вкратце хотелось бы услышать, если можно.
TheFox
 Аватар для TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 438
12.03.2014, 21:08     Представление памяти, указатели #44
Цитата Сообщение от Arkaniy Посмотреть сообщение
Как измеряется время работы программы
Например Visual Studio Profiling Tool.
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,179
12.03.2014, 21:43     Представление памяти, указатели #45
Цитата Сообщение от Arkaniy Посмотреть сообщение
то, пожалуй, всё же спрошу. Как измеряется время работы программы, функции,
есть специальные программы профилировшики
http://ru.wikipedia.org/wiki/Профили..._(информатика)
но можно и по простому
использовать функцию
clock_t clock(void)

C++
1
2
3
clock_t cl1= clock();
// тут то что нужно измерить 
clock_t cl=clock()-cl1;
http://ru.wikipedia.org/wiki/Time.h
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 21:53  [ТС]     Представление памяти, указатели #46
TheFox, ValeryS, спасибо. На досуге доберусь и до этого.
Но для полной картины с оптимизацией и прочими тонкостями работы функций нужно ведь знать ассемблер. Не так ли?
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,179
12.03.2014, 22:10     Представление памяти, указатели #47
Цитата Сообщение от Arkaniy Посмотреть сообщение
о для полной картины с оптимизацией и прочими тонкостями работы функций нужно ведь знать ассемблер. Не так ли?
ну ассемблер это " высший пилотаж" тем более что на тех знаниях которые дают ты оптимальную программу не составишь, тут уже нужно курить мануалы от Интела
современные оптимизаторы в компиляторах делают достаточно быстрый код
для оптимизации нужно знать алгоритмы
например здесь со стабильностью раз в месяц возникает вопрос проверить число простое или нет
и обязательно кто то вставит код типа такого
C++
1
2
3
4
5
6
7
bool fnc(int n)
 {
  for(int i=2;i<n;i++)
    if(n%i==0)
        return false
return true;  
 }
хотя уже озвучены алгоритмы на порядки быстрее

или еще пример
сосчитать сумму ряда от 1 до 100
C++
1
2
for(int i=1;i<101;i++)
  summ+=i;
забывая школьную математику и формулу суммы арифметической прогресии
сумма равна сумме первого и последнего члена деленная на 2 и умноженная на количество членов
C++
1
summ = (1+100)* 100/2;
могу привести кучу примеров когда изменение алгоритма ускоряет программу в разы а то и на порядки
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 22:28  [ТС]     Представление памяти, указатели #48
ValeryS, ага, понял. Нужно уметь оперировать именно с алгоритмами. Что до ассемблера, то пытался как-то начать, но так и не смог. Думаю "высший пилотаж" - это верно подмечено. В универе, к сожалению, ассемблера и не будет. Что можете посоветовать в кач-ве литературы? И вообще, стоит ли начинать углубляться в дебри? Или лучше сделать упор на языках высокого уровня. Вот последнее это уже немного в сторону трудоустройства.
ValeryS
Модератор
6413 / 4879 / 448
Регистрация: 14.02.2011
Сообщений: 16,179
12.03.2014, 22:48     Представление памяти, указатели #49
Цитата Сообщение от Arkaniy Посмотреть сообщение
Что можете посоветовать в кач-ве литературы? И вообще, стоит ли начинать углубляться в дебри? Или лучше сделать упор на языках высокого уровня.
смотря что ты хочешь?
если сидеть на одной платформе и писать например БИОС то без ассемблера не обойтись
если на разных платформах то ЯВУ
почитать мне трудно чтото советовать я ассемблер изучал еще на 8086 80286
сейчас даже не лезу( если не считать дизасемблирования) все эти конвееры распараллеливание команд нужно изучать очень подробно
могу посоветовать поискать книги Криса Касперски, достаточно живо пишет и вроде понятно, но и там косячки встречаются
для начала "Искуство дизасемблирования" и "Фундаментальные основы хакерства"
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 23:00  [ТС]     Представление памяти, указатели #50
ValeryS, спасибо большое. Не знаю дойду ли до этого, но книги всё скачаю
TheFox
 Аватар для TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 438
12.03.2014, 23:28     Представление памяти, указатели #51
Цитата Сообщение от Arkaniy Посмотреть сообщение
В универе, к сожалению, ассемблера и не будет.
На всех сколько-нибудь программистских специальностях дают немного ассемблера. Весь он есть только в Интеловских мануалах. В принципе, он сейчас не сильно нужен, так как даже драйвера можно писать без него, а работа с, например, WinAPI на нем не особенно отличается от таковой на ЯВУ, но общее представление иметь надо. Хороший FAQ по ассемблеру х86 есть на этом форуме в разделе низкоуровневого программирования Там в том числе есть ответ на вопрос что почитать.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
12.03.2014, 23:44     Представление памяти, указатели #52
Цитата Сообщение от Arkaniy Посмотреть сообщение
Как понять мне что всё же будет быстрее
Вот код сравнения времени выполнения сложений и делений. Циклы специально для того, чтобы результат замеров были точнее(при одном сложении и умножении не пройдёт ни одной милисекунды, тем более планировщик ОСИ вносит погрешность, поэтому, как в любой науке, чем больше замеров, тем точнее результат).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int i,time_start,a=5,b=5,c=5;
char text[10];
 
time_start=GetTickCount();
for(i=0;i<1000000000;i++)
{
  a=b+c;
}
itoa(GetTickCount()-time_start,text,10);
cout<<"Время выполнения 1-го участка = "<<text<<endl;
 
time_start=GetTickCount();
for(i=0;i<1000000000;i++)
{
  a=b/c;
}
itoa(GetTickCount()-time_start,text,10);
cout<<"Время выполнения 2-го участка = "<<text<<endl;
На экране появляются 2 числа. Перовое число показывает сколько милисекунд выполнялись сложения в цикле, 2-е число - деления. Очевидным будет то, что деление выполняется дольше, чем сложение - число будет больше. Это один из пример и я не собираюсь его навязывать, я пользуюсь этим - не приходится пользоваться какими-то дополнительными инструментами, да и результат в милисекунда - не плохая точность. А можно вообще QueryPerformanceCounter(), но там свои заморочки.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
13.03.2014, 10:39  [ТС]     Представление памяти, указатели #53
TheFox, на всех, да не на всех. Нам сразу сказали, что это вещь важная, но у нас не будет...
Вот этой ссылке как раз и пытался начать. Возможно, рано еще мне.
Retyrn0, спасибо, но всё же, я копну в сторону дополнительных инструментов для оптимизации
DrOffset
6787 / 3998 / 917
Регистрация: 30.01.2014
Сообщений: 6,819
13.03.2014, 11:42     Представление памяти, указатели #54
Arkaniy, по поводу ассемблера есть еще очень неплохая книжка Зубкова. (не знаю, были ли новые издания, но в любом случае посмотреть стоит)
TheFox
 Аватар для TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 438
13.03.2014, 12:06     Представление памяти, указатели #55
Цитата Сообщение от Arkaniy Посмотреть сообщение
Возможно, рано еще мне.
Ох, даже не знаю, что там может быть рано... Это же не какой нибудь Haskell или автоматы. Но, вот вам краткие лекции по самым основам ассемблера х86, такие простые, что хоть в 5 классе читай
Вложения
Тип файла: zip as.zip (6.74 Мб, 7 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 13:17     Представление памяти, указатели
Еще ссылки по теме:

C++ Представление чисел в памяти!
C++ Внутреннее представление числа в памяти
C++ Представление и структура указателя в памяти
C++ Представление в памяти массивов и матриц
Освобождение памяти и указатели C++

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

Или воспользуйтесь поиском по форуму:
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
14.03.2014, 13:17  [ТС]     Представление памяти, указатели #56
Спасибо всем отписавшимся. Книги скачал, но пока отложу их в недолгий ящик
Yandex
Объявления
14.03.2014, 13:17     Представление памяти, указатели
Ответ Создать тему
Опции темы

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