![]() |
|
Модераторы: bsa |
![]()
|
|
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
||||
|
||||
| rodnover |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
С ОС по умолчанию, но знаю, что билдер и делфи свой менеджер памяти используют.
Базовый адрес (получается виртуальный, обычно указывается 0x400000. С количеством нулей могу напутать) программы указывается в PE-заголовке. Какой там указан - с такого и будет грузится. То есть, базовый адрес - это просто значение, которое выбирается самой программой и от которой она начинает плясать.
Динамически созданные переменные могут распологаться в разных адресах кучи (int *c пример указателя на кучу). Что в вашем понимании "автоматические переменные"? Это сообщение отредактировал(а) rodnover - 16.8.2011, 21:16 |
|||
|
||||
| Hagrael |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Автоматическая переменная - это переменная, которая располагается в стеке блока и удаляется при выходе из него. Это неправильное определение?
Ясно.
Кто из вас прав? Натолкнулся на 2 новых вопроса:
Надеюсь, понятно изъяснился. Это сообщение отредактировал(а) Hagrael - 16.8.2011, 21:24 |
||||||
|
|||||||
| rodnover |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
Я просто не встречался с таким определением.
Я вот что имел ввиду. Физический адрес, то будет разным, вот только есть ли простой способ получить его из программы? http://www.wasm.ru/article.php?article=vgw03 База образа:
10. Тут, вообще, много зависит от компилятора и параметров оптимизации. Например, при некоторых параметрах оптимизации одни и те же ячейки памяти будут использоваться для разных переменных. 11. Код распологается в сегменте кода (это отдельный сегмент), а в стек помещается адрес возврата из функции (попробуйте поизучать ассемблер). Вот первая ссылка из гугла http://www.insidepro.com/kk/144r.shtml Это сообщение отредактировал(а) rodnover - 17.8.2011, 06:47 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
грубо: у объекта(переменной) есть время жизни.. на это время он (и только он) занимает определенные ячейки памяти.. http://liveworkspace.org/code/a0a9ebcea644...dcb7012796df81b Добавлено @ 08:20 пример показывает, что в разные промежутки времени на одном адресе расположены разные объекты.. функция/блок кода знает смещение в стеке до нужной переменной, и поэтому ей не важно реальный адрес переменной.. Это сообщение отредактировал(а) mes - 17.8.2011, 08:21 |
|||
|
||||
| rodnover |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
http://liveworkspace.org/code/e7691f4dd47c...8fa6e8b898da032
Вот я про такой пример имел ввиду. При некоторых опциях компилятора адрес будет одинаковым. P.S. Сайт отличный. Вообще в восторге. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
вообще то в том примере он для всех тех переменных всегда будет одинаков Добавлено @ 08:32
кажется я понял, что тс непонятно и чего мы упустили.. Hagrael, почитайте про регистры процессора, именно через них он узнает какой кусок кода выполнять и где начало данных конкретного блока/функций.. Это сообщение отредактировал(а) mes - 17.8.2011, 08:33 |
||||
|
|||||
| rodnover |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
В примере из моего сообщения на сайте адреса неодинаковы. ;) Но при некоторых опциях будут одинаковы.
Вот заставили человека ассемблер изучать, но мысль верная и полезная. |
||||
|
|||||
| Hagrael |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Классная статья, rodnover! Правда описывает она мало, и после ее прочтения появилась уйма вопросов
Думаю, вначале следует разобраться только со структурой самого exe-файла, не же ли сразу переходить к заголовку. Буду читать.
Т. е. в стандарте не сказано, когда переменная должна создаваться - при входе в блок кода или же в том месте, где она создается в коде? Вот я и думаю его поучить. Но у меня сейчас не так много времени. Хотя действительно надо бы постараться. Я почитаю про стеки вызовов функций. Как я понял, автоматические переменные - это то же самое, что и локальные?
Так "Да" или "Нет"? Появился новый вопрос: Спасибо за помощь! |
||||
|
|||||
| asmdzen |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 345 Регистрация: 28.11.2010 Репутация: 3 Всего: 5 |
а Вы перезапустите пример mes'а и посмотрите как меняется адрес переменной. т.е. насколько я помню в заголовке PE указывается адрес куда программа хотела бы загрузится, а потом система уже сама определяет может она ее туда загрузить или нет.
да, но когда эта память выделяется для него, ведь IMHO писать все переменные в начале функции или по мере необходимости уже в коде - дает примерно тот же результат, т.е. место в стеке для всех переменных выделяется при входе в функцию, разница только в том что конструкторы будут вызываться уже там где объект был объявлен. |
|||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Многие говорят: "Размер переменной зависит от платформы. Точных данных нет" etc. А от чьей платформы? Платформы разработки программы или же платформы пользователя? Как я понимаю, второе. Тогда, выходит, что всеми размерами переменных управляет Windows?
Добавлено через 2 минуты и 13 секунд Ответ получен! |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| Hagrael |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 26.6.2011 Репутация: нет Всего: нет |
Хм. У меня тут в голове промелькнуло в голове: "А зачем вообще в файле указывается базовый адрес, если Windows его очень навряд ли даст? (а вообще, Windows на него внимание обращает?) И чем этот базовый адрес будет лучше того, что даст Windows?" |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
для стековых переменных память не выделяется вообще (она выделенна изначально для всего стека) .. Добавлено @ 09:13
затем , что если загрузчик хочет загрузить по другому адресу, он должен подправить связи.. Это сообщение отредактировал(а) mes - 17.8.2011, 09:13 |
|||
|
||||
| rodnover |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
В контексте получается - да, тоже самое.
Опять таки, в конексте - могут.
Windows, Linux, MacOS, тип процессора (16, 32, 64 битный) и так далее.
Если компилятор определяет, что переменная больше не используется, то он может начать в этой ячейке хранить другую переменную.
Сколько раз я проверял под отладчиком винда всегда выдавала мне тот адрес который указан в PE-заголовке. А вообще это просто точка отсчёта, для ориентации по памяти программы все смещения в программе (jmp, jz, jnz, call) указаны относительные. Некоторые защиты строятся на изменении этого адреса. 12. В принципе да, если у него будет одинаковый формат и одинаковые соглашения. Это сообщение отредактировал(а) rodnover - 17.8.2011, 09:16 |
||||||||||
|
|||||||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |