Объектно ориентированное программирование

Тема в разделе "WASM.WIN32", создана пользователем EvilsInterrupt, 16 ноя 2004.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Binary digit, wasm`овцы!

    /*это у меня вместо приветствия :) */



    Решил я изучать алгоритм шифрования, :dntknw: Вроде бы все нашел, но то,

    что нашел заточенно под с++. Хорошо, сказал я и принялся изучать

    с++. Изучая этот ЯВУ у меня возникало, возникает и предполагаю бу-

    дут возникать вопросы. Часть из них уже не имеет смысла, ибо есть

    ответы на них, а на какую то часть, к сожалению нет уверенных отве-

    тов и доказательств! :dntknw:



    ЭТа "какая-то часть", связана с Объектно-ориентированным программиро-

    ванием. Чтобы получить вопросы, а ответы на них я действительно ис-

    кал, я решил обратиться на мой любимый форум! (пользуясь случаем пе-

    редам всем приветы). И что бы не было сумбурности я решил эти воп-

    росы задавать постепенно, как только будет получен точный и исчерпа-

    вающий ответ на прежний.



    Итак..

    вопрос №1:

    Что такое КУЧА? И что такое динамическая память(ДП)? Являются ли эти

    понятия синонимами?



    Мои предполажения:

    Куча это не занятое виртуальное адрессное пространство, т.е. какая то

    часть этого протранства занята к примеру вордом(4 ГБ), винампом(4 ГБ)

    и т.д. а остаточное это и есть куча.

    ДП - это не занятое адрессное пространство в в пространстве ПРОЦЕССА,

    т.е. свободная часть в предалах 4 ГБ.

    А по сему думаю, что ДП и куча не синонимы.



    Насколько верны мои предположения?



    ЗЫ: Прошу не отворачиваться, а помочь по мере возможности. А если есть

    возможность, то с докозательством своих суждений, пример доказательст-

    ва в аттаче.



    С уважением Evil`s Interrupt.

    [​IMG] 1160885702__constructor.cpp
     
  2. Narkomanius

    Narkomanius New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2003
    Сообщения:
    144
    это правильно.
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Правильно с:

    >Итак..

    >вопрос №1:

    Я правильно тебя понял?
     
  4. StoneColdCrazy

    StoneColdCrazy New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2004
    Сообщения:
    18
    Динамическая память - память, выделенная системой по запросу процесса из КУЧИ, со всеми вытекающими...
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    StoneColdCrazy

    А про кучу я верно написал?
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Dynamic storage - это то, что создаётся оператором new.

    Ещё есть automatic storage - это переменные, которые объявляются с использованием ключевого слова 'auto' :)

    Всё остальное - это static storage.



    Как компилятор реализует new - его личное дело, возможно это будет HeapAlloc() или sub esp,XXXXX (как в случае с 'auto')

    Как бы то ни было, и куча и то что ты называешь ДП находятся всегда в адресном пространстве твоего процесса.

    Причём, куча - это ДП, но обратное не верно.





    Хотя возможно, то что я тут написал - полная чушь :)

    Ведь, динамическая память, это те микросхемы, которые напаяны на DIMM'ах.





    ЗЫ: IMHO wasm`овцы выглядит не очень благозвучно, когда-то спектрумисты и амижники использовали такое ругательство:

    IBM'овцы =)
     
  7. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    человек старался, но я все равно не понял. :dntknw: Стас, прежде чем говорить о new надо понимать с чем он оперирует, а не понимаю этих понятий(куча, к примеру) можешь сказать однозначно?
     
  8. Arvensis

    Arvensis New Member

    Публикаций:
    0
    Регистрация:
    18 сен 2004
    Сообщения:
    72
    Адрес:
    Russia
    Вот здесь так написано:



    (Правда, в Windows это определение некорректно)

    А здесь так:



    Так что у ДП два значения.

    EvilsInterrupt

    Про кучу ты написал чушь. И так каша в башке, так ты туда каждый день еще наваливаешь.



    Кучей считают область памяти, управляемую алгоритмом динамического распределения. Если ты сам реализуешь такой алгоритм и не будешь пользоваться HeapCreate, HeapAlloc, - все равно можешь смело обзывать это кучей. Под Windows стандартная куча - это область памяти, управляемая Windows, и работа с ней ведется через Heap* функции. А насчет виртуального адресного пространства ты загнул. У любой проги его 4Гб, и винамп туда не входит - он обитает в своем пространстве. Куча - это не "не занятое пространство", а тот участок, который Винда выделит при вызове HeapCreate. Конечно, он выделится из незанятого пространства, но вряд ли займет его все.
     
  9. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    EvilsInterrupt >




    НЕТ!! Не нужно ничего понимать - ты же не пишешь 'С++ implementation' (т.е. компилятор)

    Есть такое понятие, и всё тут. Делаешь new - объект создаётся, делаешь delete - удаляется.

    Память выделяется динамически в процессе работы программы - поэтому и название dynamic storage.

    А как это всё происходит - знать не нужно.

    Это же абстракция :derisive:

    С++ memory model, например, не гарантирует, что байт - это 8 бит, что и говорить о более сложных вещах..
     
  10. StoneColdCrazy

    StoneColdCrazy New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2004
    Сообщения:
    18
    Оператор new выделяет память из кучи - если говорить о низкоуровневой реализации, то это простое резервирование памяти под структуру объекта(поля + методы + таблица виртуальных функций) и возвращение указателя на эту область памяти. Если говорить о реализации в Windows - в конечном итоге вызывается VirtualAlloc или что-то типа того (зависит от компилятора). Статические объекты, в свою очередь (просто объявленные без new) резервируются в стеке.
     
  11. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    EvilsInterrupt

    То что ты определил в самом начале ,как куча -

    это свободная виртуальная память(!) системы.

    IMHO, куча определяет метод выделения/работы

    с динамической памятью, чтобы отличить его

    от других, хотя вспомнить что-то принципиально

    отличное от кучи сейчас не могу.

    Видимо, для краткости динамическая память

    программы , выделяемая по "методу кучи"

    тоже называется куча :)
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >Есть такое понятие, и всё тут

    Если бы цивилизация всегда так говорила, то мы далеко не ушли
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Ты хочешь найти ответы на вопросы, которых не существует в принципе.

    Разновидности storage, которые понимает С++ я перечислил.

    Где там heap, откуда ты его прицепил с языку прогораммирования?

    IMHO heap - отнисится к виндосу, а не к С++.

    Дальше - данные в С++ различаются по "времени жизни", про различия в реализации речи нет (хотя разумеется само различае есть)

    То как будут реализованы все эти Dynamic storage зависит только от фантазии автора компилятора.

    Можно для каждого байта вызывать в отдельности VirtualAlloc, но так делать никто не будет :)

    А как делают, есть только один способ узнать - взять исходник, откомпилировать конкретным компилятором, и посмотреть.

    Пойми, С - это в первую очередь абстракция, создан он как раз для того, что бы у людей не возникало вопросов о всяких там байтах. Когда это поймёшь, бери отладчик и с трезвой головой вперёд :)
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Arvensis

    > Про кучу ты написал чушь. И так каша в башке, так ты туда каждый день еще наваливаешь.



    Тонко подмечено :derisive:
     
  15. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    S_T_A_S_

    ЗЫ: IMHO wasm`овцы выглядит не очень благозвучно, когда-то спектрумисты и амижники использовали такое ругательство:

    IBM'овцы =)



    "Писюканцы", однако :)



    S_T_A_S_

    Где там heap, откуда ты его прицепил с языку прогораммирования?

    IMHO heap - отнисится к виндосу, а не к С++.



    В Паскале heap (оно же "куча") была еще тогда, когда ни винды, ни ООП и в проекте не валялось. Так что осталось выяснить, что значит "куча" в Паскале, и это будет самое исконное значение этого слова.
     
  16. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    А какая разница между памятью выделяемой HeapAlloc, GlobalAlloc(GPTR,...) и VirtualAlloc ???
     
  17. Oleg_SK

    Oleg_SK Guest

    Публикаций:
    0
    Разница только в том, как ей управляет ось, т.е. в том предназначении на которое она ориентированна. Например HeapAlloc относится к функциям поддержки кучи. Кучи сами по себе ориентированы на более эффективное использование памяти, когда она требуется для множества мелких объектов (хотя, насколько я знаю, эта эффективность под вопросом). Механизм куч является как бы надстройкой над механизмом виртуальной памяти (к этому механизму относится функции – VirtualXXXX (например: VirtualAlloc)). Функции из семейства GlobalXXXX (например: GlobalAlloc) считаются устаревшими, и по словам Microsoft, поддерживаются для обратной совместимости (хотя некоторые задачи без использования этих функций не выполнить). Механизм виртуальной памяти ориентирован на более эффективное управление большими объектами. Таким образом, подводя итог, скажу: память, выделенная из куч отличается от памяти, выделенной напрямую из виртуальной памяти предполагаемым (но не обязательным) назначением, гранулярностью ее выделения и скоростью работы функций, которые ей управляют. Чем в точности отличаются работа семейства функций VirtualXXXX от GlobalXXXX я не знаю (кроме эффективности).



    З.Ы.: Надеюсь не много наврал…
     
  18. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Кто то тут про кашу, говорил и тонко подмеченные мысли!



    Так вот если бы я сидел сложа руки, то до сих пор бы думал, а что такое указатель вместо того, что в аттаче! :)

    Такое пусть дельфиец набацает и я погляжу где сила!



    Теперь о том что я называю виртуальным адресным пространством. Есть Адресное Пространство Процесса(апп) 4 ГБ для вин32. И при каждом запущенном процессе ему отводится свое АПП, так вот оконечное количество байт то должно быть?! А вот скоко всего байт можно выделить под все возможные АПП я считаю Виртуальным Адресным Пространством. Возможно жутко ошибаюсь, так поправьте.



    Теперь что понял о ДП в текущий момент в ОЗУ, уже часть занято, а часть нет и вот эта часть как я понял и есть ДП. Так как каждый раз она меняется и то что оно будет в каждый момент одинакового размера говорить нельзя! А ДП это количество байт во вставленной сейчас ОЗУ.



    ТАК?

    [​IMG] 1383958627__pointer.cpp
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    EvilsInterrupt

    > Кто то тут про кашу, говорил и тонко подмеченные мысли!



    А ты не обижайся :derisive: Но впечатление такое действительно складывается, как оказалось не у меня одного :derisive:
     
  20. StoneColdCrazy

    StoneColdCrazy New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2004
    Сообщения:
    18
    >Такое пусть дельфиец набацает и я погляжу где сила!



    Не кичись! IMHO любую задачу можно реализовать любым языком программирования. Вопрос стоит о времени написания программы.



    2EvilsInterrupt

    Не буду голословным - смотри аттач.

    [​IMG] _1015984048__pointer.dpr