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

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

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

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

14.02.2014, 23:54. Просмотров 1814. Ответов 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++
нужно сделать реализацию числа в памятиfloat d1 = 72.9e-8;... а как??? это нужно число перевести в двоичную систему, или как???

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.03.2014, 15:51 #31
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Вопрос не абсурден, если между строк прочитать, что речь идёт о медленности выполнения
Так он поэтому и абсурден. Низкий уровень на то и низкий, чтобы быть ближе к железу, а стало быть быстрее.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
12.03.2014, 15:55 #32
Цитата Сообщение от ValeryS Посмотреть сообщение
такой примерно кодКод ASM
1
2 mov eax=5;
mov [esi+6]=eax;
Ого. Т.е. можно ворочать размерами выделенной памяти, изменяя значение пары регистров?

Добавлено через 46 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
кроме Видос и компьютеров IBM PC с его Intel 80x86 есть еще куча других компьютеров и систем
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Да. Как сказал один великий кто-то в сети, лучше написать работающий код под одну архитектуру, чем не работающий, но переносимый.
Я же уже писал.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
а стало быть быстрее
Позвольте Вас перефразировать...не "абсурден", а "риторический".
SatanaXIII
Супер-модератор
Эксперт С++
5609 / 2643 / 244
Регистрация: 01.11.2011
Сообщений: 6,503
Завершенные тесты: 1
12.03.2014, 16:02 #33

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Низкий уровень на то и низкий, чтобы быть ближе к железу
к земле.

ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
12.03.2014, 16:06 #34
Цитата Сообщение от Retyrn0 Посмотреть сообщение
% медленнее, чем while(>=) - хорош!
растасовку процессоров посмотри
самая медленная операция пока что деление
Цитата Сообщение от Retyrn0 Посмотреть сообщение
step-=(int)(1600*(int)(step/1600));
и что опять деление
мдя сильно я сомневаюсь что ты оптимизацией занимался
Цитата Сообщение от Retyrn0 Посмотреть сообщение
а если цикл выполниться много раз?
он не может выполнятся много раз
потому что шаги добавляются максимум по сотне
вот это и называется смена алгоритма
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Ого. Т.е. можно ворочать размерами выделенной памяти, изменяя значение пары регистров?
где то есть разговор о размере памяти?
речь идет о обращении к элементам вектора
а если ты постоянно крутишь размерами вектора
то ни new ни malloc ни alloc не спасут
TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 438
12.03.2014, 16:43 #35
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Я не силён в архитектуре контроллеров, не знаю скорость "*" и "/", так что это скорее вопрос.
Вообще-то умножение и деление очень долгие операции даже на x86. А этот цикл быстро выполнится в конвейере. Так что скорее всего он будет быстрее и на х86
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
12.03.2014, 16:48 #36
Цитата Сообщение от ValeryS Посмотреть сообщение
мдя сильно я сомневаюсь что ты оптимизацией занимался
Думаю, я смогу с этим жить)
Цитата Сообщение от ValeryS Посмотреть сообщение
шаги добавляются максимум по сотне
Тогда, как я говорил, Вы бесконечно правы.
Цитата Сообщение от ValeryS Посмотреть сообщение
где то есть разговор о размере памяти?
Почитайте на первой странице обсуждения, там автор вопроса русским языком написал ;-)
Цитата Сообщение от ValeryS Посмотреть сообщение
то ни new ни malloc ни alloc не спасут
Меня спасали. Нужно воспользоваться не только new delete[], но ещё и мышлением с долей хитрости и будет счастье ;-)
Цитата Сообщение от ValeryS Посмотреть сообщение
вот это и называется смена алгоритма
А, да?
Но если шаги добавляются максимум по сотне, то зачем вообще while()?
C++
1
if(step>=1600)step-=1600;
Добавлено через 2 минуты
Цитата Сообщение от TheFox Посмотреть сообщение
Вообще-то умножение и деление очень долгие операции
Каюсь, про деление забыл(последнее время оптимизировал arcsin arcos, отвлёкся от бытовухи), а умножение на моей x86 архитектуре занимает столько же времени, сколько сложение и вычитание. Я проверял.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
12.03.2014, 17:11 #37
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Но если шаги добавляются максимум по сотне, то зачем вообще while()?
а на всякий случай, вдруг сбой какой нибудь
а при нормальной работе
C++
1
if(step>=1600)step-=1600;
C++
1
while(step>=1600)   step-=1600;
практически идентичны
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
12.03.2014, 17:37 #38
Цитата Сообщение от ValeryS Посмотреть сообщение
вдруг сбой какой нибудь
Если сбой, то в обоих вариантах ошибка будет ошибкой...
А привязка к 1600 на столько принципиальна? Нельзя воспользоваться более выгодными 1024 или 2048? Тогда условия вообще теряют значимость, достаточно банальных битовых операций. Ну не важно.
Вы оптимизировали свой алгоритм подменой медленной функции более быстрой - это, я считаю, ОЧЕНЬ ПРАВИЛЬНО. А почему Вы не соглашаетесь, что подмена более медленных векторов на более быстрые new delete+хитрость - тоже оптимизация алгоритма - для меня загадка. Если человек потанцует на граблях new delete, то он будет понимать что происходит с памятью и ничто не помешает ему воспользоваться векторами, если он посчитает, что скорость разработки приоритетнее скорости выполнения.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
12.03.2014, 18:06 #39
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А привязка к 1600 на столько принципиальна?
очень
шаговый движок делает 200 шагов за один оборот я использовал микрошаг( шаг делится на 8) больше делить нельзя мощность падает
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Нельзя воспользоваться более выгодными 1024 или 2048?
пытался не получается никак не смог к степени двойки привести
да и память у микроконтроллера все таки не резиновая
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А почему Вы не соглашаетесь, что подмена более медленных векторов на более быстрые new delete+хитрость - тоже оптимизация алгоритма - для меня загадка.
Я не соглашаюсь
просто сначала нужно сделать на векторах чтобы проверить алгоритм
а потом можно и заменить, только предварительно замерить именно ли вектора при перераспределении тормозят
но я сомневаюсь что выигрыш будет шибко большой внутри у вектора тот же new с delete

если уж нужно скорость то можно выделить память с избытком там миллионов 10 или 100 и все проблемы уйдут с перераспределением
извечный конфликт память/ скорость
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
12.03.2014, 19:30 #40
Цитата Сообщение от ValeryS Посмотреть сообщение
внутри у вектора тот же new с delete
Но вовнутрь вектора никак не забраться, если хочется нестандартной оптимизации.
Цитата Сообщение от ValeryS Посмотреть сообщение
я сомневаюсь что выигрыш будет шибко большой
Я не от балды говорю. Я лично сталкивался с задачей, когда изменение размеров происходило достаточно часто, чтобы вектор внёс чувствительные тормоза и я оптимизировал алгоритм и ЗНАЧИТЕЛЬНО ускорил его. Я говорю не о том, что простая замена вектора на new delete значительно ускорит алгоритм, хотя ускорение будет, но если ещё и понаглеть и подойти к памяти по другому, то ускорение очень значительное. Цифр я не помню, но помню, что почти начал собой тогда гордиться =)
Цитата Сообщение от ValeryS Посмотреть сообщение
сначала нужно сделать на векторах чтобы проверить алгоритм
Я же говорил, что если речь идёт о конкретной задаче, то да, но по контексту вопроса ТС, мне показалось, что это для изучения программирования.
Теоретически, можно научиться читать сразу по словам, но люди почему-то начинает с букв)
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
12.03.2014, 19:36 #41
Цитата Сообщение от Retyrn0 Посмотреть сообщение
но если ещё и понаглеть и подойти к памяти по другому, то ускорение очень значительное.
это называется написать свой менеджер памяти

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

Не по теме:

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

Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 21:43
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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