Binary digit, wasm`овцы! /*это у меня вместо приветствия */ Решил я изучать алгоритм шифрования, Вроде бы все нашел, но то, что нашел заточенно под с++. Хорошо, сказал я и принялся изучать с++. Изучая этот ЯВУ у меня возникало, возникает и предполагаю бу- дут возникать вопросы. Часть из них уже не имеет смысла, ибо есть ответы на них, а на какую то часть, к сожалению нет уверенных отве- тов и доказательств! ЭТа "какая-то часть", связана с Объектно-ориентированным программиро- ванием. Чтобы получить вопросы, а ответы на них я действительно ис- кал, я решил обратиться на мой любимый форум! (пользуясь случаем пе- редам всем приветы). И что бы не было сумбурности я решил эти воп- росы задавать постепенно, как только будет получен точный и исчерпа- вающий ответ на прежний. Итак.. вопрос №1: Что такое КУЧА? И что такое динамическая память(ДП)? Являются ли эти понятия синонимами? Мои предполажения: Куча это не занятое виртуальное адрессное пространство, т.е. какая то часть этого протранства занята к примеру вордом(4 ГБ), винампом(4 ГБ) и т.д. а остаточное это и есть куча. ДП - это не занятое адрессное пространство в в пространстве ПРОЦЕССА, т.е. свободная часть в предалах 4 ГБ. А по сему думаю, что ДП и куча не синонимы. Насколько верны мои предположения? ЗЫ: Прошу не отворачиваться, а помочь по мере возможности. А если есть возможность, то с докозательством своих суждений, пример доказательст- ва в аттаче. С уважением Evil`s Interrupt. 1160885702__constructor.cpp
Динамическая память - память, выделенная системой по запросу процесса из КУЧИ, со всеми вытекающими...
Dynamic storage - это то, что создаётся оператором new. Ещё есть automatic storage - это переменные, которые объявляются с использованием ключевого слова 'auto' Всё остальное - это static storage. Как компилятор реализует new - его личное дело, возможно это будет HeapAlloc() или sub esp,XXXXX (как в случае с 'auto') Как бы то ни было, и куча и то что ты называешь ДП находятся всегда в адресном пространстве твоего процесса. Причём, куча - это ДП, но обратное не верно. Хотя возможно, то что я тут написал - полная чушь Ведь, динамическая память, это те микросхемы, которые напаяны на DIMM'ах. ЗЫ: IMHO wasm`овцы выглядит не очень благозвучно, когда-то спектрумисты и амижники использовали такое ругательство: IBM'овцы =)
человек старался, но я все равно не понял. Стас, прежде чем говорить о new надо понимать с чем он оперирует, а не понимаю этих понятий(куча, к примеру) можешь сказать однозначно?
Вот здесь так написано: (Правда, в Windows это определение некорректно) А здесь так: Так что у ДП два значения. EvilsInterrupt Про кучу ты написал чушь. И так каша в башке, так ты туда каждый день еще наваливаешь. Кучей считают область памяти, управляемую алгоритмом динамического распределения. Если ты сам реализуешь такой алгоритм и не будешь пользоваться HeapCreate, HeapAlloc, - все равно можешь смело обзывать это кучей. Под Windows стандартная куча - это область памяти, управляемая Windows, и работа с ней ведется через Heap* функции. А насчет виртуального адресного пространства ты загнул. У любой проги его 4Гб, и винамп туда не входит - он обитает в своем пространстве. Куча - это не "не занятое пространство", а тот участок, который Винда выделит при вызове HeapCreate. Конечно, он выделится из незанятого пространства, но вряд ли займет его все.
EvilsInterrupt > НЕТ!! Не нужно ничего понимать - ты же не пишешь 'С++ implementation' (т.е. компилятор) Есть такое понятие, и всё тут. Делаешь new - объект создаётся, делаешь delete - удаляется. Память выделяется динамически в процессе работы программы - поэтому и название dynamic storage. А как это всё происходит - знать не нужно. Это же абстракция С++ memory model, например, не гарантирует, что байт - это 8 бит, что и говорить о более сложных вещах..
Оператор new выделяет память из кучи - если говорить о низкоуровневой реализации, то это простое резервирование памяти под структуру объекта(поля + методы + таблица виртуальных функций) и возвращение указателя на эту область памяти. Если говорить о реализации в Windows - в конечном итоге вызывается VirtualAlloc или что-то типа того (зависит от компилятора). Статические объекты, в свою очередь (просто объявленные без new) резервируются в стеке.
EvilsInterrupt То что ты определил в самом начале ,как куча - это свободная виртуальная память(!) системы. IMHO, куча определяет метод выделения/работы с динамической памятью, чтобы отличить его от других, хотя вспомнить что-то принципиально отличное от кучи сейчас не могу. Видимо, для краткости динамическая память программы , выделяемая по "методу кучи" тоже называется куча
Ты хочешь найти ответы на вопросы, которых не существует в принципе. Разновидности storage, которые понимает С++ я перечислил. Где там heap, откуда ты его прицепил с языку прогораммирования? IMHO heap - отнисится к виндосу, а не к С++. Дальше - данные в С++ различаются по "времени жизни", про различия в реализации речи нет (хотя разумеется само различае есть) То как будут реализованы все эти Dynamic storage зависит только от фантазии автора компилятора. Можно для каждого байта вызывать в отдельности VirtualAlloc, но так делать никто не будет А как делают, есть только один способ узнать - взять исходник, откомпилировать конкретным компилятором, и посмотреть. Пойми, С - это в первую очередь абстракция, создан он как раз для того, что бы у людей не возникало вопросов о всяких там байтах. Когда это поймёшь, бери отладчик и с трезвой головой вперёд
Arvensis > Про кучу ты написал чушь. И так каша в башке, так ты туда каждый день еще наваливаешь. Тонко подмечено
S_T_A_S_ ЗЫ: IMHO wasm`овцы выглядит не очень благозвучно, когда-то спектрумисты и амижники использовали такое ругательство: IBM'овцы =) "Писюканцы", однако S_T_A_S_ Где там heap, откуда ты его прицепил с языку прогораммирования? IMHO heap - отнисится к виндосу, а не к С++. В Паскале heap (оно же "куча") была еще тогда, когда ни винды, ни ООП и в проекте не валялось. Так что осталось выяснить, что значит "куча" в Паскале, и это будет самое исконное значение этого слова.
Разница только в том, как ей управляет ось, т.е. в том предназначении на которое она ориентированна. Например HeapAlloc относится к функциям поддержки кучи. Кучи сами по себе ориентированы на более эффективное использование памяти, когда она требуется для множества мелких объектов (хотя, насколько я знаю, эта эффективность под вопросом). Механизм куч является как бы надстройкой над механизмом виртуальной памяти (к этому механизму относится функции – VirtualXXXX (например: VirtualAlloc)). Функции из семейства GlobalXXXX (например: GlobalAlloc) считаются устаревшими, и по словам Microsoft, поддерживаются для обратной совместимости (хотя некоторые задачи без использования этих функций не выполнить). Механизм виртуальной памяти ориентирован на более эффективное управление большими объектами. Таким образом, подводя итог, скажу: память, выделенная из куч отличается от памяти, выделенной напрямую из виртуальной памяти предполагаемым (но не обязательным) назначением, гранулярностью ее выделения и скоростью работы функций, которые ей управляют. Чем в точности отличаются работа семейства функций VirtualXXXX от GlobalXXXX я не знаю (кроме эффективности). З.Ы.: Надеюсь не много наврал…
Кто то тут про кашу, говорил и тонко подмеченные мысли! Так вот если бы я сидел сложа руки, то до сих пор бы думал, а что такое указатель вместо того, что в аттаче! Такое пусть дельфиец набацает и я погляжу где сила! Теперь о том что я называю виртуальным адресным пространством. Есть Адресное Пространство Процесса(апп) 4 ГБ для вин32. И при каждом запущенном процессе ему отводится свое АПП, так вот оконечное количество байт то должно быть?! А вот скоко всего байт можно выделить под все возможные АПП я считаю Виртуальным Адресным Пространством. Возможно жутко ошибаюсь, так поправьте. Теперь что понял о ДП в текущий момент в ОЗУ, уже часть занято, а часть нет и вот эта часть как я понял и есть ДП. Так как каждый раз она меняется и то что оно будет в каждый момент одинакового размера говорить нельзя! А ДП это количество байт во вставленной сейчас ОЗУ. ТАК? 1383958627__pointer.cpp
EvilsInterrupt > Кто то тут про кашу, говорил и тонко подмеченные мысли! А ты не обижайся Но впечатление такое действительно складывается, как оказалось не у меня одного
>Такое пусть дельфиец набацает и я погляжу где сила! Не кичись! IMHO любую задачу можно реализовать любым языком программирования. Вопрос стоит о времени написания программы. 2EvilsInterrupt Не буду голословным - смотри аттач. _1015984048__pointer.dpr