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

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

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

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

14.02.2014, 23:54. Просмотров 1744. Ответов 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++
Помогите разработать модуль доступа к разреженной матрице, где все нулевые элементы размещены на местах с нечетными индексами строк и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
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
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 20:45  [ТС]     Представление памяти, указатели #43
Ох, ну и начался же тут холивар А всё с невинного вопроса.
Вобщем, много всего понаписано, но суть всё же одна: для разных целей разные подходы.
Retyrn0 был прав, когда писал, что программу я пишу в учебных целях, но это всё же не университетское задание, а так - для себя. Я попробую написать несколько вариантов. И с векторами сделаю, и мэллоком, и new-delete. Но вот раз пошел такой разговор об оптимизации, то, пожалуй, всё же спрошу. Как измеряется время работы программы, функции, отдельных участков кода и т.д.? Как понять мне что всё же будет быстрее? Знаю, что это уже на более низком уровне происходит, но вкратце хотелось бы услышать, если можно.
TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 438
12.03.2014, 21:08     Представление памяти, указатели #44
Цитата Сообщение от Arkaniy Посмотреть сообщение
Как измеряется время работы программы
Например Visual Studio Profiling Tool.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
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
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 21:53  [ТС]     Представление памяти, указатели #46
TheFox, ValeryS, спасибо. На досуге доберусь и до этого.
Но для полной картины с оптимизацией и прочими тонкостями работы функций нужно ведь знать ассемблер. Не так ли?
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
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
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 22:28  [ТС]     Представление памяти, указатели #48
ValeryS, ага, понял. Нужно уметь оперировать именно с алгоритмами. Что до ассемблера, то пытался как-то начать, но так и не смог. Думаю "высший пилотаж" - это верно подмечено. В универе, к сожалению, ассемблера и не будет. Что можете посоветовать в кач-ве литературы? И вообще, стоит ли начинать углубляться в дебри? Или лучше сделать упор на языках высокого уровня. Вот последнее это уже немного в сторону трудоустройства.
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
12.03.2014, 22:48     Представление памяти, указатели #49
Цитата Сообщение от Arkaniy Посмотреть сообщение
Что можете посоветовать в кач-ве литературы? И вообще, стоит ли начинать углубляться в дебри? Или лучше сделать упор на языках высокого уровня.
смотря что ты хочешь?
если сидеть на одной платформе и писать например БИОС то без ассемблера не обойтись
если на разных платформах то ЯВУ
почитать мне трудно чтото советовать я ассемблер изучал еще на 8086 80286
сейчас даже не лезу( если не считать дизасемблирования) все эти конвееры распараллеливание команд нужно изучать очень подробно
могу посоветовать поискать книги Криса Касперски, достаточно живо пишет и вроде понятно, но и там косячки встречаются
для начала "Искуство дизасемблирования" и "Фундаментальные основы хакерства"
Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
12.03.2014, 23:00  [ТС]     Представление памяти, указатели #50
ValeryS, спасибо большое. Не знаю дойду ли до этого, но книги всё скачаю
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
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 453
13.03.2014, 10:39  [ТС]     Представление памяти, указатели #53
TheFox, на всех, да не на всех. Нам сразу сказали, что это вещь важная, но у нас не будет...
Вот этой ссылке как раз и пытался начать. Возможно, рано еще мне.
Retyrn0, спасибо, но всё же, я копну в сторону дополнительных инструментов для оптимизации
DrOffset
6920 / 4113 / 941
Регистрация: 30.01.2014
Сообщений: 6,908
13.03.2014, 11:42     Представление памяти, указатели #54
Arkaniy, по поводу ассемблера есть еще очень неплохая книжка Зубкова. (не знаю, были ли новые издания, но в любом случае посмотреть стоит)
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++
нужно сделать реализацию числа в памяти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 &lt; N1; i++) Matrix1 = new int; Подскажите пожалуйста, как...


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

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

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