Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 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
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,224
12.03.2014, 19:36 #41
Цитата Сообщение от Retyrn0 Посмотреть сообщение
но если ещё и понаглеть и подойти к памяти по другому, то ускорение очень значительное.
это называется написать свой менеджер памяти

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

Не по теме:

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

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

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
написать свой менеджер памяти
Вы мне льстите) До менеджера памяти мой алгоритм не дотягивал, мягко говоря) Но что абсолютно точно, векторы мне однозначно не помогли и никакие действия над векторами не выполняло задуманного, а new delete - ами можно извращаться на сколько душе угодно)
0
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 20:45  [ТС] #43
Ох, ну и начался же тут холивар А всё с невинного вопроса.
Вобщем, много всего понаписано, но суть всё же одна: для разных целей разные подходы.
Retyrn0 был прав, когда писал, что программу я пишу в учебных целях, но это всё же не университетское задание, а так - для себя. Я попробую написать несколько вариантов. И с векторами сделаю, и мэллоком, и new-delete. Но вот раз пошел такой разговор об оптимизации, то, пожалуй, всё же спрошу. Как измеряется время работы программы, функции, отдельных участков кода и т.д.? Как понять мне что всё же будет быстрее? Знаю, что это уже на более низком уровне происходит, но вкратце хотелось бы услышать, если можно.
0
TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 437
12.03.2014, 21:08 #44
Цитата Сообщение от Arkaniy Посмотреть сообщение
Как измеряется время работы программы
Например Visual Studio Profiling Tool.
1
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,224
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
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 21:53  [ТС] #46
TheFox, ValeryS, спасибо. На досуге доберусь и до этого.
Но для полной картины с оптимизацией и прочими тонкостями работы функций нужно ведь знать ассемблер. Не так ли?
0
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,224
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;
могу привести кучу примеров когда изменение алгоритма ускоряет программу в разы а то и на порядки
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 22:28  [ТС] #48
ValeryS, ага, понял. Нужно уметь оперировать именно с алгоритмами. Что до ассемблера, то пытался как-то начать, но так и не смог. Думаю "высший пилотаж" - это верно подмечено. В универе, к сожалению, ассемблера и не будет. Что можете посоветовать в кач-ве литературы? И вообще, стоит ли начинать углубляться в дебри? Или лучше сделать упор на языках высокого уровня. Вот последнее это уже немного в сторону трудоустройства.
0
ValeryS
Модератор
7133 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,224
12.03.2014, 22:48 #49
Цитата Сообщение от Arkaniy Посмотреть сообщение
Что можете посоветовать в кач-ве литературы? И вообще, стоит ли начинать углубляться в дебри? Или лучше сделать упор на языках высокого уровня.
смотря что ты хочешь?
если сидеть на одной платформе и писать например БИОС то без ассемблера не обойтись
если на разных платформах то ЯВУ
почитать мне трудно чтото советовать я ассемблер изучал еще на 8086 80286
сейчас даже не лезу( если не считать дизасемблирования) все эти конвееры распараллеливание команд нужно изучать очень подробно
могу посоветовать поискать книги Криса Касперски, достаточно живо пишет и вроде понятно, но и там косячки встречаются
для начала "Искуство дизасемблирования" и "Фундаментальные основы хакерства"
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 23:00  [ТС] #50
ValeryS, спасибо большое. Не знаю дойду ли до этого, но книги всё скачаю
0
TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 437
12.03.2014, 23:28 #51
Цитата Сообщение от Arkaniy Посмотреть сообщение
В универе, к сожалению, ассемблера и не будет.
На всех сколько-нибудь программистских специальностях дают немного ассемблера. Весь он есть только в Интеловских мануалах. В принципе, он сейчас не сильно нужен, так как даже драйвера можно писать без него, а работа с, например, WinAPI на нем не особенно отличается от таковой на ЯВУ, но общее представление иметь надо. Хороший FAQ по ассемблеру х86 есть на этом форуме в разделе низкоуровневого программирования Там в том числе есть ответ на вопрос что почитать.
1
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 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(), но там свои заморочки.
1
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
13.03.2014, 10:39  [ТС] #53
TheFox, на всех, да не на всех. Нам сразу сказали, что это вещь важная, но у нас не будет...
Вот этой ссылке как раз и пытался начать. Возможно, рано еще мне.
Retyrn0, спасибо, но всё же, я копну в сторону дополнительных инструментов для оптимизации
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
13.03.2014, 11:42 #54
Arkaniy, по поводу ассемблера есть еще очень неплохая книжка Зубкова. (не знаю, были ли новые издания, но в любом случае посмотреть стоит)
0
TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 437
13.03.2014, 12:06 #55
Цитата Сообщение от Arkaniy Посмотреть сообщение
Возможно, рано еще мне.
Ох, даже не знаю, что там может быть рано... Это же не какой нибудь Haskell или автоматы. Но, вот вам краткие лекции по самым основам ассемблера х86, такие простые, что хоть в 5 классе читай
0
Вложения
Тип файла: zip as.zip (6.74 Мб, 7 просмотров)
Arkaniy
106 / 106 / 21
Регистрация: 29.08.2012
Сообщений: 453
14.03.2014, 13:17  [ТС] #56
Спасибо всем отписавшимся. Книги скачал, но пока отложу их в недолгий ящик
0
14.03.2014, 13:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2014, 13:17
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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