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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
14.02.2014, 23:54     Представление памяти, указатели #1
Доброго времени суток, форумчане.
Практика языка и программирования уже есть, но всё на начальном уровне. Сейчас вплотную столкнулся с указателями. Везде пишут, что они для экономии памяти, динамических массивов и много другого...
Как известно любой указатель весит 4 байта. При создании объекта используются именно эти 4 байта, при удалении оного они освобождаются. Собственно вопрос: где находятся сами объекты?
В кач-ве эксперимента проверял выделение физической памяти во время работы программы. При создании/удалении выделялось/освобождалось 4 байта соответственно. Сами объекты были намного большего размера.
Где же они "висят"?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
12.03.2014, 15:16     Представление памяти, указатели #21
Цитата Сообщение от ValeryS Посмотреть сообщение
а вектор не так действует?
АДЫН: я написал "ИМХО"
ДВА: я не люблю чёрные ящики, они мне кажутся нудными(так понятнее?) =)

Добавлено через 10 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот оно, безудержное веселье.
А Вы понимаете о чём я говорю)
На самом деле, я считаю, что человек должен сначала научиться пользоваться
Цитата Сообщение от Tulosba Посмотреть сообщение
криворукописные реализации
чтобы поправить функцию собственных рук к прямой...(хорошая метафора, мне понравилось))), а уж потом воспользоваться
Цитата Сообщение от Tulosba Посмотреть сообщение
Рабочий, проверенный временем стандартный библиотечный код
.
А потом, когда начнёшь писать что-то серьёзное, критическое к ресурсам, тогда Ваши проверенные временем штуки окажутся слегка тяжеловатыми для алгоритма и "мастер программирования", умеющий пользовать готовую кухню, либо будет довольствоваться фирменным бутербродом каждый тик процессора, либо придёт к мнению, что проверенный фирменный бутерброд - штука хорошая, легка в приготовлении, но без первого желудок может уйти в бессрочный отпуск...блин, надо было быть писателем или даже поэтом)
Векторы не медленнее "низкоуровневых функций"? "Жучки вылазили" у меня не часто, может поэтому я сейчас слишком субъективен.

Добавлено через 1 минуту
Цитата Сообщение от Arkaniy Посмотреть сообщение
вектор - это тоже
Пользуйтесь, чем хотите) Мне бы только "спасибо" капало)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Arkaniy
 Аватар для Arkaniy
106 / 106 / 6
Регистрация: 29.08.2012
Сообщений: 452
12.03.2014, 15:20  [ТС]     Представление памяти, указатели #22
Retyrn0, придерживаюсь такого же мнения. Использовать всё готовое - не всегда хорошо. Но опять же - не всегда. Порой оно того не стоит, чтобы корячиться и писать своё, когда можно взять готовое.
Тут уже всё зависит о поставленной задачи и условий её реализации.

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

Не по теме:

Retyrn0, да что та "репа"? Не за этим ведь тут сидим.

Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
12.03.2014, 15:24     Представление памяти, указатели #23
Цитата Сообщение от Arkaniy Посмотреть сообщение
не всегда
Я о том, что если человек только учит программирование и действительно хочет его понимать, а не только знать, то лучше не пользоваться готовым, а когда уже "каунт-мастер-сенсей" достигнет высот небосвода, тогда уже можно использовать готовые решения, понимая соотношение времени написания и времени выполнения, к примеру. Это для изучения. Но если это банальная задачка, которую надо сдать преподу, чтобы тот отстал, то нахрен эти грабли, пользуйтесь векторами)
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.03.2014, 15:29     Представление памяти, указатели #24
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Векторы не медленнее "низкоуровневых функций"?
Вы понимаете всю абсурдность этого вопроса? Не стоит путать время выполнения с временем разработки. В разных ситуациях приоритет может отдаваться тому или иному.
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Мне бы только "спасибо" капало)
А зачем? Заниженное ЧСВ повышать?
SatanaXIII
12.03.2014, 15:33
  #25
 Комментарий модератора 
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Мне бы только "спасибо" капало)
Retyrn0, ая-яй. 5.10
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,041
12.03.2014, 15:33     Представление памяти, указатели #26
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Векторы не медленнее "низкоуровневых функций"?
что есть низкоуровневая функция?
где тормоза при таком обращении?
C++
1
a[6]=5;
Цитата Сообщение от Retyrn0 Посмотреть сообщение
"Жучки вылазили" у меня не часто, может поэтому я сейчас слишком субъективен.
значит все таки вылазили? а тестировал на всех уровнях или работает и ладно
вектор реализован на всех платформах,и просто перекомпилируй функцию и все
А с твоим подходом переход на другую платформу придется переделывать все
И скорость разработки никто не отменял
Программа нужна "еще вчера" и ни кому будет не интересна супер-пепер быстрая программа через десять лет
А насчет
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А потом, когда начнёшь писать что-то серьёзное, критическое к ресурсам, тогда Ваши проверенные временем штуки окажутся слегка тяжеловатыми для алгоритма и "мастер программирования",
"Мастер программирования" знает как найти узкие места и как их обойти, не переписывая каждый раз printf
80 процентов ускорения лежат не в "вылизывании" функций, а в измерении алгоритма
простейший пример
на Атмеге реализовывал контроллер шагового движка есть переменная "номер шага" лежит в пределах 0-1600
реализовал сначала вот так
C++
1
step%=1600;
программа умерла, пока подсчитывал остаток, таймер уже готовит новое прерывание,и все только крутит движок на остальное времени нет
заменил на
C++
1
2
while(step>=1600)
   step-=1600;
и все полетело
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
12.03.2014, 15:38     Представление памяти, указатели #27
Цитата Сообщение от Tulosba Посмотреть сообщение
Векторы не медленнее "низкоуровневых функций"?
Вы понимаете всю абсурдность этого вопроса?
Вопрос не абсурден, если между строк прочитать, что речь идёт о медленности выполнения, а не разработки. Но я каюсь, зря не уточнил это сразу, не возникло бы недопонимания, простите.

Цитата Сообщение от Tulosba Посмотреть сообщение
В разных ситуациях приоритет может отдаваться тому или иному.
Смотрите-ка, мы сошлись во мнении, только Вы не дочитали моё сообщение, по-видимому, я там как раз это и написал.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
А зачем? Заниженное ЧСВ повышать?
Не поверите, у меня переменная ЧСВ даже не объявлена ;-) Если Вы не умеете распознавать иронию, то...не знаю..то Вы не умеете распознавать иронию)

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
где тормоза при таком обращении?
Вызывайте её пару тысяч-миллионов раз в секунду)

Добавлено через 31 секунду
Цитата Сообщение от ValeryS Посмотреть сообщение
значит все таки вылазили?
А есть люди у которых всё всегда шло гладко? ;-)

Добавлено через 32 секунды
Цитата Сообщение от ValeryS Посмотреть сообщение
А с твоим подходом переход на другую платформу
Вы что подразумеваете под платформой?
TheFox
 Аватар для TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 438
12.03.2014, 15:41     Представление памяти, указатели #28
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Я о том, что если человек только учит программирование
Я думаю, что человек который только учит программирование должен обходить malloc минимум за километр.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,041
12.03.2014, 15:46     Представление памяти, указатели #29
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Вызывайте её пару тысяч-миллионов раз в секунду)
и что????
все это превратится в такой примерно код
Assembler
1
2
mov eax=5;
mov [esi+6]=eax;
время исполнения один такт
или ты думаешь что
C++
1
*(a+6)=5;
быстрей будет?
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Вы что подразумеваете под платформой?
кроме Видос и компьютеров IBM PC с его Intel 80x86 есть еще куча других компьютеров и систем
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 1
12.03.2014, 15:50     Представление памяти, указатели #30
Цитата Сообщение от ValeryS Посмотреть сообщение
Код C++
1 step%=1600;
Цитата Сообщение от ValeryS Посмотреть сообщение
Код C++
1
2 while(step>=1600)
step-=1600;
% медленнее, чем while(>=) - хорош!
А если:
C++
1
step-=(int)(1600*(int)(step/1600));
Если step не большой, то Вы бесконечно правы, а если цикл выполниться много раз? Я не силён в архитектуре контроллеров, не знаю скорость "*" и "/", так что это скорее вопрос.

Цитата Сообщение от ValeryS Посмотреть сообщение
вектор реализован на всех платформах
Да. Как сказал один великий кто-то в сети, лучше написать работающий код под одну архитектуру, чем не работающий, но переносимый.

Добавлено через 47 секунд
Цитата Сообщение от TheFox Посмотреть сообщение
должен обходить malloc минимум за километр
Да, лучше использовать new =)
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
12.03.2014, 15:51     Представление памяти, указатели #31
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Вопрос не абсурден, если между строк прочитать, что речь идёт о медленности выполнения
Так он поэтому и абсурден. Низкий уровень на то и низкий, чтобы быть ближе к железу, а стало быть быстрее.
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 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
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
12.03.2014, 16:02     Представление памяти, указатели #33

Не по теме:

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

ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,041
12.03.2014, 16:06     Представление памяти, указатели #34
Цитата Сообщение от Retyrn0 Посмотреть сообщение
% медленнее, чем while(>=) - хорош!
растасовку процессоров посмотри
самая медленная операция пока что деление
Цитата Сообщение от Retyrn0 Посмотреть сообщение
step-=(int)(1600*(int)(step/1600));
и что опять деление
мдя сильно я сомневаюсь что ты оптимизацией занимался
Цитата Сообщение от Retyrn0 Посмотреть сообщение
а если цикл выполниться много раз?
он не может выполнятся много раз
потому что шаги добавляются максимум по сотне
вот это и называется смена алгоритма
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Ого. Т.е. можно ворочать размерами выделенной памяти, изменяя значение пары регистров?
где то есть разговор о размере памяти?
речь идет о обращении к элементам вектора
а если ты постоянно крутишь размерами вектора
то ни new ни malloc ни alloc не спасут
TheFox
 Аватар для TheFox
131 / 67 / 10
Регистрация: 13.05.2013
Сообщений: 438
12.03.2014, 16:43     Представление памяти, указатели #35
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Я не силён в архитектуре контроллеров, не знаю скорость "*" и "/", так что это скорее вопрос.
Вообще-то умножение и деление очень долгие операции даже на x86. А этот цикл быстро выполнится в конвейере. Так что скорее всего он будет быстрее и на х86
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 675
Завершенные тесты: 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
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,041
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
Сообщений: 675
Завершенные тесты: 1
12.03.2014, 17:37     Представление памяти, указатели #38
Цитата Сообщение от ValeryS Посмотреть сообщение
вдруг сбой какой нибудь
Если сбой, то в обоих вариантах ошибка будет ошибкой...
А привязка к 1600 на столько принципиальна? Нельзя воспользоваться более выгодными 1024 или 2048? Тогда условия вообще теряют значимость, достаточно банальных битовых операций. Ну не важно.
Вы оптимизировали свой алгоритм подменой медленной функции более быстрой - это, я считаю, ОЧЕНЬ ПРАВИЛЬНО. А почему Вы не соглашаетесь, что подмена более медленных векторов на более быстрые new delete+хитрость - тоже оптимизация алгоритма - для меня загадка. Если человек потанцует на граблях new delete, то он будет понимать что происходит с памятью и ничто не помешает ему воспользоваться векторами, если он посчитает, что скорость разработки приоритетнее скорости выполнения.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,041
12.03.2014, 18:06     Представление памяти, указатели #39
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А привязка к 1600 на столько принципиальна?
очень
шаговый движок делает 200 шагов за один оборот я использовал микрошаг( шаг делится на 8) больше делить нельзя мощность падает
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Нельзя воспользоваться более выгодными 1024 или 2048?
пытался не получается никак не смог к степени двойки привести
да и память у микроконтроллера все таки не резиновая
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А почему Вы не соглашаетесь, что подмена более медленных векторов на более быстрые new delete+хитрость - тоже оптимизация алгоритма - для меня загадка.
Я не соглашаюсь
просто сначала нужно сделать на векторах чтобы проверить алгоритм
а потом можно и заменить, только предварительно замерить именно ли вектора при перераспределении тормозят
но я сомневаюсь что выигрыш будет шибко большой внутри у вектора тот же new с delete

если уж нужно скорость то можно выделить память с избытком там миллионов 10 или 100 и все проблемы уйдут с перераспределением
извечный конфликт память/ скорость
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 19:30     Представление памяти, указатели
Еще ссылки по теме:

Представление класса в памяти C++
C++ Представление чисел в памяти!
C++ Внутреннее представление числа в памяти

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

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

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